Can someone please show me how I can pause my code in onCreate()
until the event listener getting data from my firebase realtime DB has completed?
I have been stuck on this for a while now, anything that does not involve me completely reformatting my code would be awesome.
My code works but when getting data from the firebase my code continues to run without waiting for the EventListener to recieve the data... I need to be able to stop the code but I do not know how...
-Just a suggestion: is it possible to use Thread.wait()
and Thread.notify()
?
I don't understand how threads/tasks/runnables work that well so a good explanation would be appreciated.
public void createNullRoom() {
room.setPlayerWhoIsSpyer(0);
room.add(1);
room.add(2);
room.add(3);
room.add(4);
room.add(5);
room.add(6);
room.setRoomCode("room_0");
room.setWinner(0);
room.setScene(0);
room.setRoundHasEnded(true);
room.setSecretWord("");
this.gameRoom.add(0,room);
pref.child(room.getRoomCode()).setValue(room);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.w(this.getClass().getName() + ".java/" + new Throwable().getStackTrace()[0].getLineNumber(), "Game.onCreate");
setContentView(R.layout.gameview_public);
pId = 0;
room = new Room();
AssignUser = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
gameRoom.clear();
long v = snapshot.child("gameRoom").getChildrenCount();
int count = (int) v;
for (int i = 0; i < count + 1; i++) {
Room r = new Room();
boolean temp = true;
try {
r = snapshot.child("gameRoom").child("room_" + i).getValue(Room.class);
} catch (IndexOutOfBoundsException e) {
temp = false;
}
if (temp) {
gameRoom.add(r);
}
}
Log.i(this.getClass().getName() + ".java/" + new Throwable().getStackTrace()[0].getLineNumber(), "gameRoom data retrieved");
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
};
// ---- VALUE EVENT LISTENER TO GET DATA ------
AssignUser = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
gameRoom.clear();
long v = snapshot.child("gameRoom").getChildrenCount();
int count = (int) v;
for (int i = 0; i < count + 1; i++) {
Room r = new Room();
boolean temp = true;
try {
r = snapshot.child("gameRoom").child("room_" + i).getValue(Room.class);
} catch (IndexOutOfBoundsException e) {
temp = false;
}
if (temp) {
gameRoom.add(r);
Log.i(this.getClass().getName() + ".java/" + new Throwable().getStackTrace()[0].getLineNumber(), "\tSize: " + gameRoom.size());
}
}
Log.i(this.getClass().getName() + ".java/" + new Throwable().getStackTrace()[0].getLineNumber(), "gameRoom data retrieved");
Log.e(this.getClass().getName() + ".java/" + new Throwable().getStackTrace()[0].getLineNumber(), "inside the snapshot, gamerooms.size: " + gameRoom.size() + " line 343");
assignUser();
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
};
// ------------------------------------------------
ref.addListenerForSingleValueEvent(AssignUser);
createNullRoom();
// ===================================THIS NEEDS TO PAUSE HERE
int i = 0;
while(playerjoined == false) {
boolean exists = true;
Log.i(this.getClass().getName() +".java/"+ new Throwable().getStackTrace()[0].getLineNumber(), "line 431: if");
try {
this.room = this.gameRoom.get(i);
} catch (IndexOutOfBoundsException e) {
exists = false;
}
if (exists) {
this.room = gameRoom.get(i);
this.roomcode = this.room.getRoomCode();
for (int q = 1; q < 7; q++) {
if(this.getFalse() == q) {
this.room.add(q);
this.pref.child(this.roomcode).setValue(this.room);
this.pId = q;
q = 6;
playerjoined = true;
}
}
if(playerjoined == false) {
i++;
}
} else {
CreateNewPublicRoom(i);
Log.i(this.getClass().getName() +".java/"+ new Throwable().getStackTrace()[0].getLineNumber(), "Game.java/" + Thread.currentThread().getStackTrace()[1].getLineNumber() + "\tNew Public Room Made");
pref.child(this.roomcode).setValue(this.room);
Log.e(this.getClass().getName() +".java/"+ new Throwable().getStackTrace()[0].getLineNumber(),"OUTSIDE the snapshot, gamerooms.size: " + gameRoom.size() + " line 403");
Log.i(this.getClass().getName() +".java/"+ new Throwable().getStackTrace()[0].getLineNumber(), "\tThis.playerjoined == "+playerjoined);
}
}
ref.child("gameRoom").child(this.room.getRoomCode()).setValue(this.room)
etc...