Я не думаю, что я реализую ListenerRegistration правильно - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть чат, который загружает 5 самых последних сообщений комнаты чата в порядке убывания снизу вверх до 100 * с использованием запроса Firebase.Сообщения, отправленные в коллекцию Firebase после загрузки этих сообщений, отображаются в нижней части экрана путем изменения положения, когда новые элементы списка вставляются в список после вызова onEvent.Вот мой код:

private void initRecyclerView() {

        //initializes and sets adapter/resets variables


        mAdapter = new ChatRecyclerViewAdapter(mMessages);
        mRecyclerView.setAdapter(mAdapter);
        firstEventListenerCalled = false;


            final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
            linearLayoutManager.setReverseLayout(true);
            mRecyclerView.setLayoutManager(linearLayoutManager);


            Query query = mCollection.orderBy("timestamp", Query.Direction.DESCENDING).limit(5;

            firstRegistration = query.addSnapshotListener(new EventListener<QuerySnapshot>() {
                @Override
                public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
                    Log.d("First SnapshotListener", "Called");

                    for (DocumentChange documentChange : queryDocumentSnapshots.getDocumentChanges()) {
                        switch (documentChange.getType()) {
                            case ADDED:

                                //Creates listener for queried messages that puts messages retrieved during initial query at end of message list,
                                // then another one after one runs its course that puts new ones at the beginning of the list
                                if (!firstEventListenerCalled) {

                                    Message message = documentChange.getDocument().toObject(Message.class);

                                    mMessages.add(message);

                                    mAdapter.notifyDataSetChanged();

                                } else if (firstEventListenerCalled) {

                                    Message message = documentChange.getDocument().toObject(Message.class);
                                    mMessages.add(0, message);
                                    mAdapter.notifyDataSetChanged();
                                    Log.d(TAG, "newMessageAdded " + message.getMessage());
                                }


                        }
                    }

                    firstEventListenerCalled = true;

                }
            });

Я пытаюсь удалить ListenerRegistration в методе onStop() действия, очистить содержимое RecyclerView в методе onRestart(), а затем повторновызовите указанный выше метод в onStart(), чтобы при остановке действия не поступало никаких сообщений и чтобы любые сообщения, отправленные в течение этого времени, появлялись среди 5, запрошенных методом initRecyclerView() при перезапуске действия:

@Override
    protected void onRestart() {
        super.onRestart();
        mMessages.clear();
        mAdapter.notifyItemRangeRemoved(0, mMessages.size());
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "onStart Called");
        initRecyclerView();

    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "onStop Called");
        firstRegistration.remove();

        if (refreshRegistraton != null) {
            refreshRegistraton.remove();
        }
    }

    @Override
    public void onBackPressed() {
        finish();

    }

Однако при возобновлении активности с использованием этой стратегии происходит следующее:

  1. 5 запрашиваемых сообщений отображаются в правильном порядке
  2. Любые сообщения, отправленные во времяактивность была остановлена, появляются в дополнение к этим 5 сообщениям и в обратном порядке:

    • старое сообщение 1

    • старое сообщение 2

    • Старое сообщение 3

    • Старое сообщение 4

    • Старое сообщение 5

    • Сообщение отправлено во время остановки 2

    • Сообщение отправлено во время остановки 1

Новые сообщения загружаются в порядке, описанном для firstEventListenerCalled == true, но оно ложно в начале метода initRecyclerView() при каждом его вызове.,Они вообще не должны загружаться отдельно, так как я удалил слушателей и полностью воссоздал RecyclerView.Чего мне не хватает?

1 Ответ

0 голосов
/ 19 ноября 2018

Похоже, что сопротивление диска , включенное по умолчанию для Android, было причиной этого поведения. Отключив его, я получил желаемый результат.

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