2016-11-26 6 views
0

現在、Firebaseチャットアプリケーションを開発中です。デモをダウンロードして完了しようとしました(http://myapptemplates.com/simple-android-chat-app-tutorial-firebase-integration/Firebase Androidチャットリアルタイム機能が動作しない

メッセージを送受信できましたが、実際にチャットボックスを終了して新しいメッセージを表示するために再度読み込む必要があります。もう1つのことは、登録されたすべてのユーザーが、1人の受信者と送信者ではなく、同じメッセージを送受信することです。私は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); 
} 

ここでは、あなたがSingleValueListenerを追加しました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

です。これにより、データは1回だけ読み取られます。リアルタイム機能を使用するには、次のようにValueEventListenerを追加する必要があります。

FirebaseDatabase.getInstance(). getReference("messages").addValueEventListener(new ValueEventListener() { 
関連する問題