我相信这个问题会产生许多主要基于意见的好答案。但我还是会发表我的意见:
我个人将 Firebase 与 Android Architecture Components 一起使用,它(来自文档)是:
帮助您设计稳健、可测试和
可维护的应用程序。从管理 UI 组件的类开始
生命周期和处理数据持久性。
该库提供 2 个类来让您了解数据生命周期:Live Data 和 ViewModel。您可以在 Firebase 博客上找到集成这两个库的指南: [Part1、Part2、Part3]。
要使用该库,您需要将 Google 存储库添加到项目的 build.gradle 文件中:
allprojects {
repositories {
jcenter()
google()
}
}
然后添加对你应用的 build.gradle 文件的依赖:
implementation "android.arch.lifecycle:extensions:1.1.0"
所以你创建了一个从 LiveData 扩展的类:
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;
}
public FirebaseQueryLiveData(DatabaseReference ref) {
this.query = ref;
}
@Override
protected void onActive() {
Log.d(LOG_TAG, "onActive");
query.addValueEventListener(listener);
}
@Override
protected void onInactive() {
Log.d(LOG_TAG, "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());
}
}
}
然后创建一个 ViewModel 来加载这个用户的数据:
public class UserViewModel extends ViewModel{
private static final DatabaseReference USERS_REF =
FirebaseDatabase.getInstance().getReference("users/exampleDataFromUsers");
private final FirebaseQueryLiveData liveData = new FirebaseQueryLiveData(USERS_REF);
private final LiveData<String> liveData =
Transformations.map(liveData, new Function<DataSnapshot, String> {
@Override
public String apply(DataSnapshot dataSnapshot) {
//do something with the snapshot and return a String
}
});
@NonNull
public LiveData<String> getUserReports() {
return liveData;
}
}
最后,为了在你的活动中获取这些数据,你只需要调用你的 ViewModel 并观察它的 LiveData:
UserViewModel viewModel = ViewModelProviders.of(this).get(UserViewModel.class);
viewModel.getUserReports().observe(this, new Observer<String>() {
@Override
public void onChanged(@Nullable String reports) {
if (reports != null) {
// update the UI here with values
}
}
});