2017-10-29 3 views
0

Ich mache eine Realtime-Tracking-Anwendung von einem Tutorial online, hier setze ich das Anwesenheitssystem mit Firebase. Aber es stürzt mit:Wert des DataSnapShot-Objekts, der null auf getvalue zurückliefert (Boolean.class)

/java.lang.NullPointerException: Der Versuch, virtuelle Methode ‚boolean java.lang.Boolean.booleanValue()‘ auf ein Null-Objekt Verweis aufrufen

Ich verstehe nicht, was falsch, der Typ, der dies codiert hat funktioniert perfekt.

Die Ausnahme geschieht in dieser Zeile: if (dataSnapshot.getValue (Boolean.class)) {

Wenn ich dies das datasnapshot Objekt auf dem Bildschirm melden Sie sich einen Schlüssel hat, aber kein Wert

HILFE!

ListOnline Klasse

//firebase 
DatabaseReference onlineRef,currentUserRef,counterRef; 
FirebaseRecyclerAdapter<User,ListOnlineViewHolder> adapter; 

//View 
RecyclerView listOnline; 
RecyclerView.LayoutManager layoutManager; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_list_online); 

    //setting the recyclerview 
    listOnline = (RecyclerView)findViewById(R.id.listOnlineRecyclerview); 
    listOnline.setHasFixedSize(true); 
    layoutManager = new LinearLayoutManager(this); 
    listOnline.setLayoutManager(layoutManager); 

    //set toolbar and menu/join,logout 
    Toolbar toolbar = (Toolbar)findViewById(R.id.toolbarID); 
    toolbar.setTitle("Presence System"); 
    setSupportActionBar(toolbar); 

    //firebase 
    onlineRef = FirebaseDatabase.getInstance().getReference().child("info/connected"); 
    counterRef = FirebaseDatabase.getInstance().getReference("lastOnline"); //create new child name lastOnline 
    currentUserRef = FirebaseDatabase.getInstance().getReference().child(FirebaseAuth.getInstance().getCurrentUser().getUid()); 

    setupSystem(); 
    //after setup we load all users and display in recyclerview 
    //this is online list 
    updateList(); 
} 

private void updateList() { 
    adapter = new FirebaseRecyclerAdapter<User, ListOnlineViewHolder>(
      User.class,R.layout.user_layout,ListOnlineViewHolder.class,counterRef 
    ) { 
     @Override 
     protected void populateViewHolder(ListOnlineViewHolder viewHolder, User model, int position) { 
      viewHolder.emailTextView.setText(model.getEmail()); 
     } 

    }; 
    adapter.notifyDataSetChanged(); 
    listOnline.setAdapter(adapter); 
} 

private void setupSystem() { 
    onlineRef.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
       if(dataSnapshot.getValue(Boolean.class)){ 
        currentUserRef.onDisconnect().removeValue(); 
        //set online user in list 
        counterRef.child(FirebaseAuth.getInstance().getCurrentUser().getUid()) 
          .setValue(FirebaseAuth.getInstance().getCurrentUser().getEmail(),"Online"); 
        adapter.notifyDataSetChanged(); 
       } 
      } 



     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
    counterRef.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for(DataSnapshot postSnapshot:dataSnapshot.getChildren()){ 
       User user = postSnapshot.getValue(User.class); 
       Log.d("LOG",""+user.getEmail()+"is "+user.getStatus()); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater menuInflater = getMenuInflater(); 
    menuInflater.inflate(R.menu.main_menu,menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()){ 
     case R.id.action_join: 
      counterRef.child(FirebaseAuth.getInstance().getCurrentUser().getUid()) 
        .setValue(FirebaseAuth.getInstance().getCurrentUser().getEmail(),"Online"); 
      break; 
     case R.id.action_logout: 
      currentUserRef.removeValue(); 

    } 
    return super.onOptionsItemSelected(item); 
} 

}

Benutzerklasse

public class User { 
private String email,status; 


public User(String email, String status) { 
    this.email = email; 
    this.status = status; 
} 

public User() { 

} 

public String getEmail() { 
    return email; 
} 

public void setEmail(String email) { 
    this.email = email; 
} 

public String getStatus() { 
    return status; 
} 

public void setStatus(String status) { 
    this.status = status; 
}} 

MainActivity

public class MainActivity extends AppCompatActivity { 

Button signInButton; 
private final static int LOGIN_PERMISSION = 1000; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    signInButton = (Button) findViewById(R.id.signInButton); 
    signInButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      startActivityForResult(AuthUI.getInstance().createSignInIntentBuilder().setAllowNewEmailAccounts(true).build(),LOGIN_PERMISSION); 

     } 

    }); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    if(requestCode == LOGIN_PERMISSION){ 
     startNewActivity(resultCode,data); 
    } 
} 

private void startNewActivity(int resultcode, Intent data) { 

    if(resultcode == RESULT_OK){ 
     Intent intent = new Intent(MainActivity.this,ListOnline.class); 
     startActivity(intent); 
     finish(); 

    } 
    else{ 
     Toast.makeText(this,"login failed!!",Toast.LENGTH_SHORT).show(); 
    } 
}} 
+0

[? Was für eine Nullpointer ist, und wie kann ich es beheben] (https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and (how-do-i-fix-it) – Grimthorr

+0

@Grimthorr Danke, aber nicht hilfreich – Akay

Antwort

0

In Ihrem setupSystem() Methode, Sie sind das Anbringen eines Zuhörers onlineRef (der info/connected Knoten) und dann auf einen Wert Boolean den zurückgegebenen Wert Rangier.

Jedoch gibt DataSnapshot#getValue()null zurück, wenn keine Daten am angegebenen Speicherort in der Datenbank vorhanden sind. Wenn dies geschieht, wird der Aufruf dataSnapshot.getValue(Boolean.class) eine Boolean Variable mit dem Wert null erstellen, die dann nicht auf einen wahren Wert in Ihrer aktuellen if-Anweisung überprüft werden kann (siehe Check if null Boolean is true results in exception).

Sie könnten prüfen, ob getValue() nicht null zuerst zurückkehren durch eine Null-überprüfen, um Ihre if-Anweisung hinzu:

if(dataSnapshot.getValue() != null && dataSnapshot.getValue(Boolean.class)){ 
    // ... 
} 

Oder prüfen, ob der Standort DataSnapshot#exists() mit existiert:

if(dataSnapshot.exists() && dataSnapshot.getValue(Boolean.class)){ 
    // ... 
} 

jedoch Wenn Sie versuchen, detect connection state, wollten Sie den Hörer an den Knoten .info/connected stattdessen anhängen? Wie in der Dokumentation:

Für viele präsenzbezogene Funktionen ist es hilfreich, wenn Ihre App online oder offline kennt. Firebase Realtime Database bietet einen speziellen Speicherort unter /.info/connected, der jedes Mal aktualisiert wird, wenn sich der Verbindungsstatus des Firebase Realtime Database-Clients ändert. Hier ist ein Beispiel:

DatabaseReference connectedRef = FirebaseDatabase.getInstance().getReference(".info/connected"); 
connectedRef.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot snapshot) { 
    boolean connected = snapshot.getValue(Boolean.class); 
    if (connected) { 
     System.out.println("connected"); 
    } else { 
     System.out.println("not connected"); 
    } 
    } 

    @Override 
    public void onCancelled(DatabaseError error) { 
    System.err.println("Listener was cancelled"); 
    } 
}); 
+0

Ich reparierte es war ein kleines "." Ich habe einen neuen Absturz – Akay

+0

com.google.firebase.database.DatabaseException: Kann Objekt des Typs java.lang.String on nicht konvertieren: Benutzer user = postSnapshot.getValue (User.class) ; – Akay

+0

Dies ist von der '/ lastOnline'-Position, die Sie versuchen, zu einer 'User'-Instanz zu marshallen. Können Sie Ihre Datenbankstruktur teilen? Es ist wahrscheinlich, dass der/die Wert (e) an diesem Ort nicht mit Ihrer Klasse 'Benutzer' übereinstimmen. – Grimthorr

0

seiner Null, da es nicht in der Datenbank vorhanden ..

onlineRef = FirebaseDatabase.getInstance().getReference().child("info/connected"); 

Sie auf der oben genannten Position abfragen. So ist dataSnapshot eine Momentaufnahme des oben ..

if(dataSnapshot.getValue(Boolean.class)){ 

Dies gilt nicht in der Datenbank vorhanden sein .. So erhalten Sie diesen Fehler

+0

Wie kann ich das beheben? Ich bin ein sehr neu zu Firebase so nichts dagegen, meine Ignoranz – Akay

+0

@Akay was meinst du zwei Benutzer eingestellt, wie Lehrer und Schüler? –

+0

Entschuldigung, ich meine, ich habe zwei Benutzer in der Datenbank. Wie kann es null – Akay

0

Es scheint, dass Sie keinen Wert in der Datenbank haben. Dies wird Griff, um den Fehler

if(dataSnapshot.getValue(Boolean.class) != null && dataSnapshot.getValue(Boolean.class)){ 
Verwandte Themen