RCa*_*ers 0 java android asynchronous firebase firebase-realtime-database
我想这个问题将适用于使用异步调用的任何应用程序。
我对这一切还比较陌生,而我遇到的问题是从Firebase到我的Android应用程序中获取数据。
在整个应用程序中,有几个类需要使用数据库中“用户”表中的数据,我可以从中获得以下数据:
DatabaseReference reference = FirebaseDatabase.getInstance().getReference()
.child("users").child("exampleDataFromUsers");
reference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// do something with the snapshot
}
Run Code Online (Sandbox Code Playgroud)
我想创建一个通用类来处理从Firebase检索的数据,例如:
public class FirebaseDataHandler() {
static String getUserReports() {
// get Reports
}
static int getUserAge() {
// get age
}
}
Run Code Online (Sandbox Code Playgroud)
但是由于它是异步检索的,因此对这些方法的任何调用都只会返回null。结果,我的代码当前到处都是重复的代码。
如果有人对实现此目标的更好方法有任何见识,将不胜感激。谢谢。
我相信这个问题将主要基于观点会产生许多好的答案。但是无论如何,我仍然会发表我的意见:
我个人将Firebase与Android Architecture Components一起使用(根据文档)是:
一组库,可帮助您设计健壮,可测试和可维护的应用程序。从用于管理UI组件生命周期和处理数据持久性的类开始。
该库提供了2个类来使您的数据生命周期感知:Live Data和ViewModel。您可以在Firebase博客上找到集成这两个库的指南:[Part1,Part2,Part3]。
要使用该库,您需要将Google存储库添加到项目的build.gradle文件中:
allprojects {
repositories {
jcenter()
google()
}
}
Run Code Online (Sandbox Code Playgroud)
然后在应用程序的build.gradle文件上添加依赖项:
implementation "android.arch.lifecycle:extensions:1.1.0"
Run Code Online (Sandbox Code Playgroud)
因此,您创建了一个从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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
并创建一个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;
}
}
Run Code Online (Sandbox Code Playgroud)
最后,为了在您的活动中获取此数据,您只需要调用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
}
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
162 次 |
| 最近记录: |