保留来自子事件侦听器的Firebase数据,并在重新创建片段/活动时避免重新加载

时间:2019-04-22 07:53:23

标签: android firebase android-fragments screen-orientation

我正在使用聊天应用程序。 ChatFragment具有一个chatList,可以从Firebase实时数据库获取数据,并使用childEventListener(onChildAdded)逐一添加。

当方向更改或用户离开片段时,我想保留接收到的chatList,删除侦听器,然后在用户返回聊天片段或方向更改完成时重新附加侦听器。

问题是,当重新创建活动/片段时,childEventListener丢失了,因此我必须重新创建新的侦听器。但是随后,由于调用了onChildAdded并再次添加所有项,所以chatList被复制了。

我尝试了

FirebaseDatabase.getInstance().setPersistenceEnabled(true);

但是它不起作用,它仍然称为onChildAdded。然后,使用singleValueEventListener的每个查询将无法正常工作,因为它请求的是缓存的数据,而不是实时数据库。

我想将chatList的项目与onChildAdded中收到的项目进行比较,如果存在,则跳过它。但这是相当浪费的时间,不是我想做的:保留当前数据,无需从Firebase DB重新加载,还保留侦听器以查找新项目。

或者我可以保存所有的监听器并以某种方式取回,我不知道。

这是我的活动和片段的一些代码

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

因此,简而言之,我想在重新启动/重新创建活动/片段时不使用setPersistenceEnabled(true)来保留新项目/更改项目的数据和所有Firebase侦听器。

对不起,我的英语不好。非常感谢。

1 个答案:

答案 0 :(得分:0)

不知道为什么要重新创建活动(和片段),将实例状态保存在片段中是正确的做法。但是,您应该在Fragment.onCreate(savedInstanceState)中检索数据。这是第一个调用的方法,也是建立非图形数据的好地方