我正在使用聊天应用程序。 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侦听器。
对不起,我的英语不好。非常感谢。
答案 0 :(得分:0)
不知道为什么要重新创建活动(和片段),将实例状态保存在片段中是正确的做法。但是,您应该在Fragment.onCreate(savedInstanceState)中检索数据。这是第一个调用的方法,也是建立非图形数据的好地方