I am using a framework called LibGdx, it is multiplatform, so when I need to write platform-specific code I need to create interfaces. For example, If I want to get a top score from my db I would create an interface-method called:
public int getTopScore();
In Android I then implement this interface and write the Firebase Logic:
@Override
public int getTopScore() {
DatabaseReference topScoreRef =
leaderboardDataBase.getReference("top_score");
topScoreRef.child("top_score").addValueEventListener(new
ValueEventListener()
{
@Override
public void onDataChange(DataSnapshot snapshot) {
//topScore is a member variable of the class
topScore = snapshot.getValue(Integer.class);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
return topScore;
}
This is always returning null and causing a NullPointer exception. I know it has to do with multithreading. Is there a way to wait for the other thread to finish before moving on or do I have to entirely restructure.
Thanks
EDIT: Here's the error:
04-11 22:02:33.542 30334-30334/com.samuel.doubledodge E/Error:
java.lang.NullPointerException: Attempt to invoke virtual method 'int
java.lang.Integer.intValue()' on a null object reference
at com.samuel.doubledodge.AndroidDatabaseAccess$1.onDataChange(AndroidDatabaseAccess.java:56)
at com.google.android.gms.internal.zzbmz.zza(Unknown Source)
at com.google.android.gms.internal.zzbnz.zzYj(Unknown Source)
at com.google.android.gms.internal.zzboc$1.run(Unknown Source)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5466)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:984)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)