onChildAdded занимает слишком много времени, чтобы начать вызывать - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть приложение чата, которое реализовано только с использованием объектов базы данных Firebase Realtime.Никаких конкретных компонентов обмена сообщениями.

Я добавляю прослушиватель для объекта чата (или таблицы), в котором хранятся сообщения.Слушатель добавляется с помощью addChildEventListener, который должен вызвать метод onChildAdded для извлечения всех дочерних элементов из сущности чата в момент, когда он присоединен, и всякий раз, когда добавляется сообщение.

Проблема заключается в том, что при создании таблицы отправляемПо первому сообщению и присоединению слушателя я вижу, что таблица и сообщение создаются на консоли Firebase, но метод onChildAdded вызывается не много раз спустя.Затем, как только он вызывается, иногда более чем через 5 минут, я могу отправлять и получать сообщения, как и ожидалось.

Что может быть причиной такой длительной задержки?

Я уже пытался установить слушателя сразу после создания таблицы, которую он слушает, но не работал.

Создание сущности чата (таблицы)

final DatabaseReference chat = dbReference.child("chat");

final DatabaseReference user = dbReference.child("user");

chatId = chat.push().getKey();

Log.d("mymessages", "createChat(), chatId = " + chatId);

HashMap newChatMap = new HashMap();
newChatMap.put("id", chatId);
newChatMap.put("users/" + currentUserId, true);
newChatMap.put("users/" + userId, true);

// Creating chats table
chat.child(chatId)
        .child("info")
        .updateChildren(newChatMap);
Log.d("mymessages", "Chat table created.");

Создание сообщения и вставка его в сущность чата

DatabaseReference newMessageDb = dbReference.child("chat").child(chatId).push();

Log.d("mymessages", "message created.");

Map newMessageMap = new HashMap<>();
newMessageMap.put("text", editTextMessage);
newMessageMap.put("creator", currentUserId);

newMessageDb.updateChildren(newMessageMap);
Log.d("mymessages", "message's text and creator added.");

Добавление слушателя

 dbReference.child("chat").child(chatId).addChildEventListener(new ChildEventListener() {

    @Override
    public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

        if (dataSnapshot.exists()) {

            \\Fetch the messages...

        } else {

            Log.d("mymessages", "fetchChatMessages(), dataSnapshot does not exists.");
        }
    }

    @Override
    public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
    }

    @Override
    public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
    }

    @Override
    public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {                        
    }
});

Весь код, который запускается внутри кнопки, отправляющей сообщение

String editTextMessage = messageBodyEditText.getText().toString();

        if (!editTextMessage.isEmpty()) {

            if (!chatExists) {
                final DatabaseReference chat = dbReference.child("chat");
                final DatabaseReference user = dbReference.child("user");

                chatId = chat.push().getKey();

                HashMap newChatMap = new HashMap();
                newChatMap.put("id", chatId);
                newChatMap.put("users/" + currentUserId, true);
                newChatMap.put("users/" + userId, true);

                // Creating chats table
                chat.child(chatId)
                    .child("info")
                    .updateChildren(newChatMap);

                //Inserting the contact's id in the current user's chat table
                HashMap newUserChatMap = new HashMap();
                newUserChatMap.put(chatId + "/contact", userId);

                user.child(currentUserId)
                    .child("chat")
                    .updateChildren(newUserChatMap);

                //Inserting the current user's id in the contact's chat table
                HashMap newContactChatMap = new HashMap();
                newContactChatMap.put(chatId + "/contact", currentUserId);

                user.child(userId)
                     .child("chat")
                    .updateChildren(newContactChatMap);

                chatExists = true;

                newChatCreated = true;
            }

            if (chatId != null) {
                DatabaseReference newMessageDb = dbReference.child("chat").child(chatId).push();

                Map newMessageMap = new HashMap<>();
                newMessageMap.put("text", editTextMessage);
                newMessageMap.put("creator", currentUserId);

                newMessageDb.updateChildren(newMessageMap);

                messageBodyEditText.setText("");


                if (messageList.isEmpty()) {
                    if (chatExists) {

                        if (ConnectivityHelper.isConnectedToNetwork(this)) {
                                dbReference.child("chat").child(chatId).addChildEventListener(new ChildEventListener() {
                                    @Override
                                    public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                                        loadingMessages.setVisibility(View.VISIBLE);
                                        loadingWarning.setVisibility(View.VISIBLE);
                                        loadingWarning.setText("Loading messages...");



                                        if (dataSnapshot.exists() && !dataSnapshot.getKey().equals("info")) {
                                            loadingWarning.setText("Loading messages...");
                                            String text = "";
                                            String creatorId = "";

                                            Object newText = dataSnapshot.child("text").getValue();
                                            Object newCreatorId = dataSnapshot.child("creator").getValue();

                                            if (newText != null) {
                                                text = newText.toString();
                                            }
                                            if (newCreatorId != null) {
                                                creatorId = newCreatorId.toString();
                                            }

                                            String creatorName = "";

                                            if (!creatorId.equals(currentUserId))
                                                creatorName = userName;
                                            else
                                                creatorName = creatorId;

                                            Message message = new Message(dataSnapshot.getKey(), creatorName, text);
                                            messageList.add(message);
                                            messagesAdapter.notifyDataSetChanged();

                                            recyclerView.smoothScrollToPosition(messagesAdapter.getItemCount() - 1);

                                            loadingMessages.setVisibility(View.INVISIBLE);
                                            loadingWarning.setVisibility(View.INVISIBLE);
                                            sendButton.setVisibility(View.VISIBLE);

                                        } else {
                                            loadingMessages.setVisibility(View.INVISIBLE);
                                            loadingWarning.setText("Messages not found. \nCould not load your messages :/");
                                        }
                                    }

                                    @Override
                                    public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                                        if (dataSnapshot.exists())

                                    }

                                     @Override
                                    public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

                                    }

                                    @Override
                                    public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

                                    }

                                    @Override
                                    public void onCancelled(@NonNull DatabaseError databaseError) {
                                        loadingMessages.setVisibility(View.INVISIBLE);
                                        loadingWarning.setText("Loading cancelled. \nCould not load your messages :/");
                                        Log.d("mymessages", "fetchChatMessages(), onCancelled called.");
                                    }
                                 });

                        } else {
                            lyNoConnection.setVisibility(View.VISIBLE);
                            Log.d("mymessages", "Not connected to network.");
                        }

                    } else {
                        loadingMessages.setVisibility(View.INVISIBLE);
                        loadingWarning.setVisibility(View.INVISIBLE);
                        sendButton.setVisibility(View.VISIBLE);

                    }
                }

            } else {
                Log.d("mymessages", "chatId = null");
            }

        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...