首页 > 解决方案 > 这是从 android 的 Firebase 数据库中以小块加载数据的正确方法吗?

问题描述

这是我第一次在这里发帖,如果我做错了事,请纠正我。

我正在尝试通过使用 Firebase 数据库创建一个简单的聊天应用程序来学习 Android 开发。现在我被困在加载更小块聊天数据的正确实现上。这是我到目前为止所做的。

存储库

 public MutableLiveData<ArrayList<Chats>> loadPrivateChats(String withUid) {

        roomId = generateUniqueRoomId(myId, withUid);

            privateChatQuery =
      firebaseDatabase.getReference().child(Constants.PRIVATE_CHAT_NODE)
                            .child(roomId).orderByChild("timeStamp").limitToLast(limit);

        listenerPrivateChatQuery = new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull @NotNull DataSnapshot snapshot,
                                     @Nullable @org.jetbrains.annotations.Nullable
                                             String previousChildName) {

                   Chats mCurrentChats = snapshot.getValue(Chats.class);
                   privateChatsArrayList.add(mCurrentChats);
                   privateChatsLiveData.setValue(privateChatsArrayList);


                   loadMore.setValue(true);

            }
....
 privateChatQuery.addChildEventListener(listenerPrivateChatQuery);

        return privateChatsLiveData;


    }


   public void loadOldChats(){

        privateChatsArrayList.clear();
        limit = limit+3;
        loadMore.setValue(false);
     
  }

视图模型

  public MutableLiveData<ArrayList<Chats>> loadPrivateChats(String withUid) {

        MediatorLiveData<ArrayList<Chats>> chatsMediatorLiveData = new MediatorLiveData<>();

        LiveData<Boolean> loadMore = chatRepository.loadMore;

        chatsMediatorLiveData.addSource(chatRepository.loadPrivateChats(withUid), new Observer<ArrayList<Chats>>() {
            @Override
            public void onChanged(ArrayList<Chats> chats) {

                chatsMediatorLiveData.setValue(chats);
            }
        });

        chatsMediatorLiveData.addSource(loadMore, new Observer<Boolean>() {
            @Override
            public void onChanged(Boolean aBoolean) {
                if (!aBoolean) {
                    chatsArrayList.clear();
                    chatsArrayList = chatRepository.loadPrivateChats(withUid).getValue();
                    chatsMediatorLiveData.setValue(chatsArrayList);

                }
            }
        });

        return chatsMediatorLiveData;
    }

 public void loadMoreChats() {
        chatRepository.loadOldChats();
    }

分段

chatViewModel.loadPrivateChats(withUid).observe(getViewLifecycleOwner(),
                    new Observer<ArrayList<Chats>>() {
                        @Override
                        public void onChanged(ArrayList<Chats> chats) {
                            if (chats != null) {
                                  privateChatAdapter.submitList(new ArrayList<>(chats));
                                int pos = chats.size() -1;
                                binding.recyclerViewPublicChat.smoothScrollToPosition(pos);
                            }
                        }
                    });

private void loadMoreChats() {
        chatViewModel.loadMoreChats();
        binding.swipeRefreshLayout.setRefreshing(false);
    }

现在我的问题是,每当将消息发送到另一台设备时,都会间歇性地出现一些行为(重复消息,消息以随机顺序显示)。我的 recyclerview 使用 List 适配器


private static final DiffUtil.ItemCallback<Chats> DIFF_CALLBACK = new DiffUtil.ItemCallback<Chats>() {
        @Override
        public boolean areItemsTheSame(@NonNull Chats oldItem, @NonNull Chats newItem) {
            return oldItem.timeStamp.equals(newItem.timeStamp);
        }

        @Override
        public boolean areContentsTheSame(@NonNull Chats oldItem, @NonNull Chats newItem) {
            return oldItem.message.equals(newItem.message) && oldItem.senderID.equals(newItem.senderID);

        }

我将非常感谢有关以较小块加载数据的正确方法的任何线索。

谢谢

标签: javaandroidfirebasefirebase-realtime-database

解决方案


推荐阅读