아하
검색 이미지
생활꿀팁 이미지
생활꿀팁생활
생활꿀팁 이미지
생활꿀팁생활
흰사마귀126
흰사마귀12619.03.29

firebase를 이용한 안드로이드 스튜디오 공부중에 순서에 대해 이해가 안가는 것이 있습니다.

viewHolder.chatStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { destinationUid = userModels.get(i).getUid(); ChatModel chatModel = new ChatModel(); chatModel.users.put(uid,true); chatModel.users.put(destinationUid,true); if(chatRoomdUid == null){ FirebaseDatabase.getInstance().getReference().child("chatRooms").push().setValue(chatModel).addOnSuccessListener(new OnSuccessListener<Void>() { @Override public void onSuccess(Void aVoid) { checkChatRoom(); Log.d("생성됨1", chatRoomdUid + " 1 "); } }); } Intent intent = new Intent(v.getContext(),ChatActivity.class); intent.putExtra("destinationUid",userModels.get(i).getUid()); chatRoomdUid = null; Log.d("생성됨2", chatRoomdUid + "2"); context.startActivity(intent); } }); void checkChatRoom(){ FirebaseDatabase.getInstance().getReference().child("chatRooms").orderByChild("users/"+uid).equalTo(true).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { for(DataSnapshot item : dataSnapshot.getChildren()){ ChatModel chatModel = item.getValue(ChatModel.class); if(chatModel.users.containsKey(destinationUid)){ chatRoomdUid = item.getKey(); Log.d("생성됨3", chatRoomdUid + "3"); } } } @Override public void onCancelled(@NonNull DatabaseError databaseError) { } }); }

제가 chatstart에 해당하는 것을 처음 클릭 했을 때

logcat에 나오는 log는 생성됨 1 다음에 생성됨 3이 나오고 끝입니다.

그리고 chatstart를 두번째 클릭하면 생성됨 2가 나옵니다.

제가 이해가 되지 않는 부분은 두가지 입니다.

1.처음 클릭 했을 때, onclick 부분의 if문이 끝나고 startActivity( intent)를 실행하기 전에 왜 생성됨2가 나오지 않는지 알고 싶습니다.

  1. onclick 부분의 if문에서 checkChatRoom() 다음에 생성됨 1인데 왜 생성됨3의 로그가 아닌 생성됨 1의 로그가 먼저 나오는 것인가요?

아무리 생각해도 순서가 이해가 되지 않습니다. 도움 부탁드릴게요..

*destinationUid, chatRoomUid 의 초기값은 null입니다.

55글자 더 채워주세요.
답변의 개수
1개의 답변이 있어요!
    1. 첫 번째 클릭에서는 로그2가 안나오고 두 번째 클릭에서 로그 2가 나오는 것 을 보면 Firebasedatabase 접근시 스레드 블락이 일어나는 것으로 추측되어 어느 부분에 계속 스레드가 잡혀있기 때문에 로그2로 진행이 안되거나 어느 부분에 크래쉬가 난 경우도 생각해 볼 수 있습니다.

    1. Checkchatroom내의 리스너 부분이 별도의 스레드로 돌고 있기 때문에 checkchatroom 구문은 바로 리턴되어 로그 1이 먼저 나오게 되고 그 후 등록된 리스너에 의해 데이터가 바뀌었을 때 로그 3이 호출됩니다.