2016-11-26 4 views
0

В настоящее время я работаю над приложением Firebase chat. Я загрузил демо и попытался его заполнить (http://myapptemplates.com/simple-android-chat-app-tutorial-firebase-integration/)Firebase Android Chat Realtime Функциональность не работает

Я смог отправлять и получать сообщения, но проблема в том, что я должен фактически выйти из чата и загрузить его снова, чтобы увидеть новые сообщения. Другое дело, что все зарегистрированные пользователи отправляют и получают одни и те же сообщения, а не только получатели и отправители. Я новичок в Firebase, поэтому мне действительно трудно это исправить.

Вот sendMessage() функция:

private void sendMessage() { 
    if (txt.length() == 0) 
     return; 

    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
    imm.hideSoftInputFromWindow(txt.getWindowToken(), 0); 

    String s = txt.getText().toString(); 

    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 
    if(user != null) { 
     final Conversation conversation = new Conversation(s, 
       Calendar.getInstance().getTime(), 
       user.getUid(), 
       buddy.getId(), 
       ""); 
     conversation.setStatus(Conversation.STATUS_SENDING); 
     convList.add(conversation); 
     final String key = FirebaseDatabase.getInstance() 
       .getReference("messages") 
       .push().getKey(); 
     FirebaseDatabase.getInstance().getReference("messages").child(key) 
       .setValue(conversation) 
       .addOnCompleteListener(new OnCompleteListener<Void>() { 
              @Override 
              public void onComplete(@NonNull Task<Void> task) { 
               if (task.isSuccessful()) { 
                convList.get(convList.indexOf(conversation)).setStatus(Conversation.STATUS_SENT); 
               } else { 
                convList.get(convList.indexOf(conversation)).setStatus(Conversation.STATUS_FAILED); 
               } 
               FirebaseDatabase.getInstance() 
                 .getReference("messages") 
                 .child(key).setValue(convList.get(convList.indexOf(conversation))) 
                 .addOnCompleteListener(new 
                         OnCompleteListener<Void>() { 
                          @Override 
                          public void onComplete(@NonNull Task<Void> task) { 

                           adp.notifyDataSetChanged(); 
                          } 
                         }); 

              } 
             } 
       ); 
    } 
    adp.notifyDataSetChanged(); 
    txt.setText(null); 
} 

Вот loadConversationList()

FirebaseDatabase.getInstance(). getReference("messages").addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 
      if(user != null) { 
       for (DataSnapshot ds : dataSnapshot.getChildren()) { 
        Conversation conversation = ds.getValue(Conversation.class); 
        if ((conversation.getReceiver().contentEquals(user.getUid()) && conversation.getSender().contentEquals(buddy.getId())) 
          || (conversation.getSender().contentEquals(user.getUid()) && (conversation.getReceiver().contentEquals(buddy.getId())))) { 
         convList.add(conversation); 
         if (lastMsgDate == null 
           || lastMsgDate.before(conversation.getDate())) 
          lastMsgDate = conversation.getDate(); 

         adp.notifyDataSetChanged(); 

        } 
       } 
      } 
     } 

ответ

0

Вы добавили SingleValueListener. Это будет читать данные только один раз. Чтобы получить функциональность в реальном времени, вы должны добавить ValueEventListener следующим образом:

FirebaseDatabase.getInstance(). getReference("messages").addValueEventListener(new ValueEventListener() { 
Смежные вопросы