2016-08-09 3 views
-3

Wenn ich auf ein Element geklickt habe, um Detailaktivität zu öffnen, bekam ich einen Nullpointer-Fehler und konnte herausfinden, welche Variable die Null, mContactItemDetail, angibt. Ich erhalte Daten aus Firebase-Datasnapshot innerhalb von OnCreate und versuche, sie an eine globale Variable mContactItemDetail zu übergeben, die scheinbar übergeben wird oder nicht. Wenn ich versuche, die mContactItemDetail aufzurufen, erhalte ich einen Nullwert. Kann mir jemand helfen zu verstehen warum, was fehlt mir?java.lang.NullPointerException but Wert wurde zugewiesen, Firebase datasnapshot

public class DetailActivityFragment extends Fragment { 

    private static final String LOG_TAG = DetailActivityFragment.class.getSimpleName(); 

    private DatabaseReference databaseRef; 
    private String mContactID; 
    private ContactItemDetail mContactItemDetail; 

    private TextView textViewName; 
    private TextView textViewNumber; 
    private TextView textViewLocation; 
    private TextView textViewDescription; 

    public DetailActivityFragment() { 
    } 

    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     databaseRef = FirebaseDatabase.getInstance().getReference(); 

     Bundle arg = getArguments(); 
     mContactID = arg.getString(Constants.DETAIL_CONTACT_ID); 

     Log.v(LOG_TAG, "ContactID " + mContactID); 

     databaseRef.child(Constants.FIREBASE_LOCATION_DETAIL_LIST).child(mContactID). addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       Log.v(LOG_TAG, "Datasnapshot: " + dataSnapshot.getValue()); 

       ContactItemDetail contactItem = dataSnapshot.getValue(ContactItemDetail.class); 


       if (contactItem != null) { 
        mContactItemDetail = contactItem; 
       } 
       Log.v(LOG_TAG, "contactdetail 1: " + mContactItemDetail);    
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_detail, container, false); 

     initializeDetailScreen(rootView); 


     Log.v(LOG_TAG, "contactdetail 2: " + mContactItemDetail); 

    // textViewName.setText(mContactItemDetail.getContactName()); 
    // textViewNumber.setText(Long.toString(mContactItemDetail.getTel())); 
    // textViewLocation.setText(mContactItemDetail.getLocation()); 
    // textViewDescription.setText(mContactItemDetail.getDescription()); 


     return rootView; 
    } 

    public void initializeDetailScreen(View view) { 
     textViewName = (TextView) view.findViewById(R.id.detail_textview_name); 
     textViewNumber = (TextView) view.findViewById(R.id.detail_textview_contact_number); 
     textViewLocation = (TextView) view.findViewById(R.id.detail_textview_location); 
     textViewDescription = (TextView) view.findViewById(R.id.detail_textview_description); 
    } 
} 

Logcat für mContactItemDetail in onCreate gibt einen Wert

08-09 22: 08: 11,929 5234-5234/co.house.myapp V/DetailActivityFragment: contactdetail 1: co.house.myapp .model.ContactItemDetail @ 41ff1c18

Aber Logcat für mContactItemDetail in onCreateView einen auf null

08-09 22: 08: 11,859 5234-5234/co.house.myapp V/DetailActivityFragment: contactdetail 2: null

und die mContactItemDetail Klasse ist als unten

public class ContactItemDetail { 

    private String contactName; 
    private String description; 
    private long fax; 
    private String location; 
    private String postalAddress; 
    private long rating; 
    private long tel; 

    public ContactItemDetail() { 
    } 

    public ContactItemDetail(String contactName, String description, long fax, String location, 
          String postalAddress, long rating, long tel) { 
     this.contactName = contactName; 
     this.description = description; 
     this.fax = fax; 
     this.location = location; 
     this.postalAddress = postalAddress; 
     this.rating = rating; 
     this.tel = tel; 
    } 

    public String getContactName() { 
     return contactName; 
    } 

    public String getDescription() { 
     return description; 
    } 

    public long getFax() { 
     return fax; 
    } 

    public String getLocation() { 
     return location; 
    } 

    public String getPostalAddress() { 
     return postalAddress; 
    } 

    public long getRating() { 
     return rating; 
    } 

    public long getTel() { 
     return tel; 
    } 
} 

Und das ist die Fehlerprotokoll, die ich bekomme, wenn ich die textViewNumber in onCreateView Kommentar aus, weil der Nullwert I

08-09 22:01:13.359 6462-6462/? E/SamsungIME: mOCRHelper is null 
08-09 22:01:13.649 6462-6462/? E/SamsungIME: mOCRHelper is null 
08-09 22:01:13.869 612-612/? E/asset: Creating SharedZip 0x5a0e8d08 /mnt/asec/com.truecaller-1/pkg.apk 
08-09 22:01:13.869 612-612/? E/asset: [email protected]+++ opening zip '/mnt/asec/com.truecaller-1/pkg.apk' by system_server(system_server) 
08-09 22:01:14.669 612-620/? E/asset: [email protected]+++ closed '/mnt/asec/com.truecaller-1/pkg.apk' by system_server(FinalizerDaemon) 
08-09 22:01:15.879 612-612/? E/asset: Creating SharedZip 0x5f8c4640 /mnt/asec/com.truecaller-1/pkg.apk 
08-09 22:01:15.889 612-612/? E/asset: [email protected]+++ opening zip '/mnt/asec/com.truecaller-1/pkg.apk' by system_server(system_server) 
08-09 22:01:22.189 4744-4744/? E/NetworkScheduler.SR: Invalid parameter app 
08-09 22:01:22.189 4744-4744/? E/NetworkScheduler.SR: Invalid package name : Perhaps you didn't include a PendingIntent in the extras? 
08-09 22:01:22.209 28564-8748/? E/Drive.UninstallOperation: Package still installed co.house.myapp 
08-09 22:01:22.549 612-796/? E/Watchdog: [email protected] 4195 
08-09 22:01:22.929 2863-2875/? E/SPPClientService: ============PushLog. commonIsShipBuild. stop! 
08-09 22:01:22.929 2863-2875/? E/SPPClientService: [PushClientApplication] Push log off : This is Ship build version 
08-09 22:01:23.679 2843-2843/? E/memtrack: Couldn't load memtrack module (No such file or directory) 
08-09 22:01:23.679 2843-2843/? E/android.os.Debug: failed to load memtrack module: -2 
08-09 22:01:23.679 2811-2811/? E/memtrack: Couldn't load memtrack module (No such file or directory) 
08-09 22:01:23.679 2811-2811/? E/android.os.Debug: failed to load memtrack module: -2 
08-09 22:01:25.649 2917-2917/? E/memtrack: Couldn't load memtrack module (No such file or directory) 
08-09 22:01:25.649 2917-2917/? E/android.os.Debug: failed to load memtrack module: -2 
+1

Ihre Variable ist null, bis die Firebase-Methode ** abgeschlossen ist. Das ist asynchroner Code für Sie. –

Antwort

2

einfach warten, bis die Firebase Methode zu beenden glauben. Versuchen Sie nicht, das variable Ergebnis sofort zu verwenden.

private void showContactItemDetail(ContactItemDetail item) { 
    if (item == null) return; // Might want to Log here 

    textViewName.setText(item.getContactName()); 
    textViewNumber.setText(Long.toString(item.getTel())); 
    textViewLocation.setText(item.getLocation()); 
    textViewDescription.setText(item.getDescription()); 
} 

Dann können Sie diese Methode, wie so in onCreateView verwenden. Andernfalls erhalten Sie in Ihren Ansichten auch einen Nullfehler, wenn Sie die Details festlegen.

Das gesagt - onCreate wird überhaupt nicht benötigt, außer databaseRef zu setzen.

View rootView = inflater.inflate(R.layout.fragment_detail, container, false); 
initializeDetailScreen(rootView); 

databaseRef.child(Constants.FIREBASE_LOCATION_DETAIL_LIST).child(mContactID). addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     mContactItemDetail = dataSnapshot.getValue(ContactItemDetail.class); 
     showContactItemDetail(mContactItemDetail);    
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 

    } 
}); 

return rootView; 
+0

Ihre Lösung hat funktioniert, aber ich bin mir nicht sicher, ob ich hier asynchron verstehe und was mein Fehler war. Korrigieren Sie mich, wenn ich falsch liege, würden Sie sagen, dass in meinem Code onDataChange() -Methode zur gleichen Zeit wie onCreateView() -Methode ausgeführt wurde (das wäre das asynchrone ich denke). Und ich habe versucht auf die mContactItemDetail zuzugreifen, bevor onDataChange() mContactItemDetail (nicht FINISHED) einen Wert zuweisen konnte. Und das war mein Fehler. Ich bin immer noch neu in der Programmierung und versuche, ein grundlegendes Verständnis für das Prinzip zu bekommen. – ndheti

+0

Ja, im Wesentlichen ist genau das passiert. Sie haben auf eine Netzwerkanforderung (asynchron) gewartet, während anderer Code ausgeführt wurde –

Verwandte Themen