我正在开发Android + Firebase应用程序,但由于我是两个techlogies的新手,我遇到了异步调用的问题,我还没有找到解决方案,所以希望你能帮助我。
我的Activity onCreate
方法中有以下代码段:
final ArrayList<AssetLocation> assetsLocations = new ArrayList<>();
DatabaseReference assetsLocationReference = database.getReference(FirebaseReferences.ASSETSLOCATION_REFERENCE);
assetsLocationReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
ArrayList<String> assetsLocationSpinner = new ArrayList<String>();
// Create an ArrayAdapter using the string array and a default spinner layout
for (DataSnapshot postSnapshot : snapshot.getChildren()) {
//Getting the data from snapshot
AssetLocation assetsLocation = postSnapshot.getValue(AssetLocation.class);
assetsLocations.add(AssetLocation);
}
}
@Override
public void onCancelled(DatabaseError firebaseError) {
System.out.println("The read failed: " + firebaseError.getMessage());
}
});
我也有一个非常类似的电话,但我没有获得地点,而是获得类型。
在这段代码之后(同样在onCreate方法内),我正在调用setScreenInfo
这是一个用所述数据填充两个微调器(并做更多东西)的函数,但由于它是异步调用,我执行它时,微调器是空白的。
一旦拨打电话,我该如何执行setScreenInfo
?我尝试使用.once()/.on()
,但它并未被Android Studio识别为功能。
感谢您的帮助!
答案 0 :(得分:1)
在这段代码之后(在onCreate方法中也是如此),我调用了setScreenInfo,这是一个用所述数据填充微调器(并做更多东西)的函数,但由于它是异步调用,所以微调器是我执行它时是空白的。
您不能从后台线程修改UI。通常我会调用runOnUIThread
,传递一个新的Runnable()和final
我要通过的数据的副本。
final String myData = "updateData";
ActivityName.this.runOnUiThread(new Runnable() {
public void run() {
// use myData to update UI
}
});
但是,似乎已迁移到AsyncTask
:Converting runOnUiThread to AsyncTask
我个人仍然使用runOnUIThread
。它更明确。
答案 1 :(得分:0)
由于异步行为,您需要移动assetsLocations
ArrayList的声明:
final ArrayList<AssetLocation> assetsLocations = new ArrayList<>();
在onDataChange()
方法中,如assetsLocationSpinner
ArrayList所示。请记住,onDataChange
始终称为asynchronously
。这意味着在AssetLocation
被调用之前执行将onDataChange
类的对象添加到列表的语句。这就是为什么你的列表在该方法之外是空的。
希望不会有帮助。
答案 2 :(得分:0)
您可以使用线程:
thread = new Thread() {
@Override
public void run() {
try {
//background tasks
runOnUiThread(new Runnable() {
@Override
public void run() {
//UI tasks
}
});
}
catch (JSONException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
};
thread.start();`
或者您可以使用Firebase Multi Query方法。 链接:Only load layout when firebase calls are complete