我正在为 Android 使用 Java 上的 Firebase 的实时数据库,我正在尝试编写一组帮助函数来促进从/向 RTDB 读取和写入函数。
我的函数如下所示,应该返回数据库中我的停车对象的 HashMap;我获得了对我的数据库的引用并添加了一个 onSuccessListener
,我在其中迭代快照并将每个 Parking
对象添加到我的 HashMap 并返回 HashMap parkings
。
问题是在 onSuccessListener 运行之前函数返回 parkings
没有值。
public static ArrayList<Parking> getParkingLots() {
DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference();
Task<DataSnapshot> dataSnapshotTask = mDatabase.get();
ArrayList<Parking> parkings = new ArrayList<Parking>();
dataSnapshotTask.addOnSuccessListener(new OnSuccessListener<DataSnapshot>() {
@Override
public void onSuccess(DataSnapshot dataSnapshot) {
Iterable<DataSnapshot> parkingsData = dataSnapshot.getChildren();
for (DataSnapshot parking :
parkingsData) {
parkings.add(parking.getValue(Parking.class));
}
}
});
return parkings;
}
我也尝试了这个实现,我直接尝试从任务 datSnapshotTask
中获取结果,但我得到一个异常抛出 java.lang.IllegalStateException: Task is not yet complete
。
public static HashMap<String, Parking> getParkingLots() {
DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference();
Task<DataSnapshot> dataSnapshotTask = mDatabase.get();
Iterable<DataSnapshot> parkingsData = dataSnapshotTask.getResult().getChildren();
HashMap<String, Parking> parkings = new HashMap<String, Parking>();
for (DataSnapshot parking :
parkingsData) {
parkings.put(parking.getKey(), parking.getValue(Parking.class));
}
return parkings;
}
有没有办法以等待方式从任务中获取结果?
我认为在 java 中不可能以“等待方式”做。
但是在 kotlin 中,我们可以使用 coroutines 。
使用
Task.asDeferred
扩展功能,我们可以将一个Task
转换为Deferred
对象。或可以使用Task.await()
,而无需将task
转换为Deferred
对象。使用
Task.asDeferred()
扩展函数使用依赖项:要调用
suspend
函数,我们需要启动一个CoroutinesomeCoroutineScope
是CoroutineScope
实例。在Android中,它可以是viewModelScope
class和ViewModel
inlifecycleScope
或Activity
的Fragment
的CoroutineScope
,也可以是 ```implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.0'