我正在创建一个带有底部导航控件的活动的Android应用程序,该控件使用户可以在不同片段之间进行导航。在这些片段中,我有来自Firebase后端的数据列表,并以RecyclerView
显示。
问题是,每次我在这些片段之间导航时,所有数据都会再次下载,而我想使用缓存的数据并只听更改。
到目前为止,我所做的是使用ViewModel
和LiveData
,它们工作正常。此外,即使我在片段之间导航,如果我断开电话与Internet的连接,数据也会显示(当然也不会下载)。
在显示数据的片段中:
LiveData<List<UncompletedTask>> taskLiveData = viewModel.getTaskLiveData();
taskLiveData.observe(this, new Observer<List<UncompletedTask>>() {
@Override
public void onChanged(List<UncompletedTask> uncompletedTasks) {
myAdapter.submitList(uncompletedTasks);
listener.onTodoListElementsLoaded(uncompletedTasks.size());
}
});
在视图模型中,我有:
private TodoTaskRepository repository;
@NonNull
public LiveData<List<UncompletedTask>> getTaskLiveData() {
return repository.getTaskLiveData();
}
在TodoTaskRepository
中,我在构造器中初始化FirebaseQueryLiveData
,并在getTaskLiveData()
中将其返回。
最终FirebaseQueryLiveData
像这样:
public class FirebaseQueryLiveData extends LiveData<DataSnapshot> {
private static final String LOG_TAG = "FirebaseQueryLiveData";
private final Query query;
private final MyValueEventListener listener = new MyValueEventListener();
public FirebaseQueryLiveData(Query query) {
this.query = query;
}
@Override
protected void onActive() {
query.addValueEventListener(listener);
}
@Override
protected void onInactive() {
query.removeEventListener(listener);
}
private class MyValueEventListener implements ValueEventListener {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
setValue(dataSnapshot);
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.e(LOG_TAG, "Can't listen to query " + query, databaseError.toException());
}
}
}
我如何第一次下载所有数据,然后只听更改,而如果没有任何变化,则在片段之间导航时不下载相同的数据?
答案 0 :(得分:0)
如果您启用了disk persistence,那么除非数据已更改,否则不会再次下载数据
FirebaseDatabase.getInstance()。setPersistenceEnabled(true);
当您运行ValueEventListener
时,第一次可以正确下载数据,第二次运行相同的ValueEventListener
时,则数据来自持久性本地缓存
此外,如果断开电话与Internet的连接,数据确实来自相同的本地缓存。