Сохраняйте данные Firebase, которые поступают от дочернего прослушивателя событий, и избегайте перезагрузки при воссоздании фрагмента / действия. - PullRequest
0 голосов
/ 22 апреля 2019

Я работаю над приложением чата.ChatFragment имеет chatList, который получает данные из базы данных Firebase в реальном времени и добавляет один за другим элемент, используя childEventListener (onChildAdded).

Когда изменение ориентации или пользователь покидают фрагмент, я хочу сохранить полученный ChatList, удалитьпрослушиватель, а затем повторно присоединить прослушиватель, когда пользователь возвращается к фрагменту чата или когда изменение ориентации завершено.

Проблема в том, что при повторном создании действия / фрагмента childEventListener был потерян, поэтому я должен повторносоздать нового слушателя.Но затем chatList был продублирован, потому что был вызван onChildAdded и снова добавлен весь элемент.

Я пытался

FirebaseDatabase.getInstance().setPersistenceEnabled(true);

Но это не сработало, он все еще вызывал onChildAdded.И затем, каждый запрос, использующий singleValueEventListener, не будет работать должным образом, поскольку он запрашивает кэшированные данные, а не базу данных реального времени.

Я думаю о сравнении элемента chatList с элементом, который был получен в onChildAdded, если он существует,просто пропустите это.Но это довольно бесполезное время, и не то, что я хочу сделать: сохранить текущие данные, не нужно перезагружать базу данных Firebase, а также сохранить прослушиватель для нового элемента.

Или я могу сохранить весь прослушиватель и получитьэто как-то не знаю.

Вот код моей деятельности и фрагмент

В HomeActivity - код для сохранения фрагмента в связку

@Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        if (chatListFragment.isAdded())
            getSupportFragmentManager().putFragment(outState, ChatListFragment.TAG, chatListFragment);
    }

Затем я возвращаю его обратно в onCreate ().Здесь все поля фрагмента были потеряны: chatList, listener ...

if(getSupportFragmentManager().getFragment(savedInstanceState, ChatListFragment.TAG) != null) {
                chatListFragment = getSupportFragmentManager().getFragment(savedInstanceState, ChatListFragment.TAG);
            }

В ChatFragment я сохраняю список чата в связке

@Override
    public void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putParcelableArrayList(KEY_CHAT_LIST, chatList);
        outState.putInt(KEY_CURRENT_POSITION, currentItemPosition);
        //TODO: save data
    }

И возвращаю его обратно на onActivityCreated()

@Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        if(savedInstanceState != null) {
            chatList = savedInstanceState.getParcelableArrayList(KEY_CHAT_LIST);
            currentItemPosition = savedInstanceState.getInt(KEY_CURRENT_POSITION);
            chatListAdapter.setChatList(chatList);
            chatListAdapter.notifyDataSetChanged();

            //the method below gets data from firebase DB by creating a 
            //childEventListener, that mean it gets all the chat item again 
            //but if I don't call it, I can't listen to onChildAdded :((

            //presenter.loadChatList(chatList);
        } else {
            chatList.clear();
            chatListAdapter.setChatList(chatList);
            chatListAdapter.notifyDataSetChanged();

            presenter.loadChatList(chatList);
        }
    }

Короче говоря, я хочу сохранить как данные, так и все прослушиватели Firebase для нового элемента / измененного элемента при перезапуске / повторном создании действия / фрагмента без использования setPersistenceEnabled (правда).

Извините за мой плохой английский.Большое вам спасибо.

1 Ответ

0 голосов
/ 22 апреля 2019

Не зная, ПОЧЕМУ действие (и фрагмент) воссозданы, сохранение состояния экземпляра во фрагменте является правильным решением.Тем не менее, вы должны получить данные в Fragment.onCreate (saveInstanceState).Это первый вызванный метод и хорошее место для настройки неграфических данных

...