当前位置: 首页 > 知识库问答 >
问题:

Firebase Android聊天实时功能不起作用

方权
2023-03-14

我目前正在开发一个Firebase聊天应用程序。我下载了一个演示并尝试完成它(http://myapptemplates.com/simple-android-chat-app-tutorial-firebase-integration/)

我可以发送和接收消息,但问题是我必须退出聊天框并重新加载它才能看到新的消息。另一件事是,所有注册用户都发送和接收相同的消息,而不是只有一个收件人和发件人。我对Firebase是新的,所以我真的很难修复它。

    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);
}
    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();

                    }
                }
            }
        }

共有1个答案

姚煜
2023-03-14

您已经添加了SingleValueListener。这将只读取一次数据。要获得实时功能,应该添加valueEventListener,如下所示:

FirebaseDatabase.getInstance(). getReference("messages").addValueEventListener(new ValueEventListener() {
 类似资料:
  • 本文向大家介绍Android实现蓝牙聊天功能,包括了Android实现蓝牙聊天功能的使用技巧和注意事项,需要的朋友参考一下 蓝牙,时下最流行的智能设备传输数据的方式之一,通过手机app和智能设备进行连接,获取设备上的测量数据,我们生活中随处可见的比如蓝牙智能手环,蓝牙电子秤,蓝牙心电测量设备等等。 本篇我将紧接着上篇结尾所写,一起来看下手机之间如何通过蓝牙实现文字聊天。 先贴出上篇的一些demo;

  • 本文向大家介绍NodeJS实现一个聊天室功能,包括了NodeJS实现一个聊天室功能的使用技巧和注意事项,需要的朋友参考一下 看效果 一直说我喜欢卖关子,这次直接看效果: 聊天界面(喜欢的可以自己画一个比较逼真的页面) 前文 先说一下为什么写这个东西,最近不是在写NodeJS知识点的梳理嘛,但是我发现梳理的过程着实无聊的要死,虽然已经快梳理一半了,只是还没发布,这个不重要,重要的是不做点什么东西确实

  • 本文向大家介绍iOS实现聊天输入框功能,包括了iOS实现聊天输入框功能的使用技巧和注意事项,需要的朋友参考一下 经常使用微信聊天,没事儿就会想输入框的实现过程,所以抽空,也实现了一个输入框的功能; 经过封装,使用就非常的简单了,在需要的VC中,实现方法如下: 主要就是上面的添加,此时输入框就已经添加到当前的VC中;稍后会讲到里面的代理方法的作用; 工程结构如下图   主要是红色线标出的两个类,结构

  • 本文向大家介绍Asp.net使用SignalR实现聊天室的功能,包括了Asp.net使用SignalR实现聊天室的功能的使用技巧和注意事项,需要的朋友参考一下 一、引言 在前一篇文章《Asp.net使用SignalR实现酷炫端对端聊天功能》中,我向大家介绍了如何实现实现端对端聊天的功能的,在这一篇文章中将像大家如何使用SignalR实现群聊这样的功能。 二、实现思路   要想实现群聊的功能,首先我

  • 本文向大家介绍微信小程序websocket实现即时聊天功能,包括了微信小程序websocket实现即时聊天功能的使用技巧和注意事项,需要的朋友参考一下 今天给大家分享一下本人做小程序使用websocket的一点小经验,希望对大家有所帮助。 使用之前肯定首先要了解一下websocket是什么,简单来讲websocket就是客户端与服务器之间专门建立的一条特殊通道,请求只需要请求一次,而且还可以从通道

  • 本文向大家介绍微信小程序websocket实现聊天功能,包括了微信小程序websocket实现聊天功能的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了微信小程序websocket实现聊天功能的具体代码,供大家参考,具体内容如下 效果图: chat.js chat.wxml chat.wxss github前后端都有地址:wx-chat  为大家推荐现在关注度比较高的微信小程序教程一篇