如何避免从Firebase实时数据库下载相同数据?

时间:2019-05-17 09:42:04

标签: android firebase firebase-realtime-database

我正在创建一个带有底部导航控件的活动的Android应用程序,该控件使用户可以在不同片段之间进行导航。在这些片段中,我有来自Firebase后端的数据列表,并以RecyclerView显示。 问题是,每次我在这些片段之间导航时,所有数据都会再次下载,而我想使用缓存的数据并只听更改。

到目前为止,我所做的是使用ViewModelLiveData,它们工作正常。此外,即使我在片段之间导航,如果我断开电话与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());
        }
    }
}

我如何第一次下载所有数据,然后只听更改,而如果没有任何变化,则在片段之间导航时不下载相同的数据?

1 个答案:

答案 0 :(得分:0)

如果您启用了disk persistence,那么除非数据已更改,否则不会再次下载数据

  

FirebaseDatabase.getInstance()。setPersistenceEnabled(true);

当您运行ValueEventListener时,第一次可以正确下载数据,第二次运行相同的ValueEventListener时,则数据来自持久性本地缓存

此外,如果断开电话与Internet的连接,数据确实来自相同的本地缓存。