我在android中使用Google Firebase数据库。我需要两个从数据库中获取两组数据-userInfo和AssignmentInfo。然后,我需要将它们组合起来并在回收器视图中显示数据。解决此问题的最佳方法是什么?由于数据的获取是异步的,因此变得越来越混乱。
我能想到的一种方法是,如果其他异步功能都已完成,则检查两个异步功能是否成功。如果是这样,请获取其数据,合并并初始化适配器。这是最好的方法吗?
最佳答案
当我必须先从数据库中下载某些内容,然后才能将用户登录到应用程序时,我已经解决了此类问题,因此我解决了此问题。
要使用ObservableInteger
,您可以执行此操作
首先声明它
private ObservableInteger mObsInt;
然后在您的onCreate中,将有一个侦听器等待mObsInt的值更改,这些值更改后,您可以执行任何操作
//Listener
mObsInt = new ObservableInteger();
mObsInt.set(0);
mObsInt.setOnIntegerChangeListener(new OnIntegerChangeListener()
{
@Override
public void onIntegerChanged(int newValue)
{
if (mObsInt.get()==1)
//Do something if the first asyncTask finishes
if (mObsInt.get()==2){
//Do something if the second asyncTask finishes, in this case i just go to another activity when both asyncTasks finish
Intent mainIntent = new Intent().setClass(LoginActivity.this, Principal.class);
startActivity(mainIntent);
finish();
}
}
});
所以,它如何运作
ObservableInteger
将在变量mObsInt
中寻找变化,因此可以说,如果mObsInt
等于1,它将执行某些操作;如果等于2,则将执行另一操作,因此,使用2 很容易,当其中一个asynctasks
完成asynctasks
等于1时,如果另一个mObsInt
完成则asyncTask
将是mObsInt
,那么您的mObsInt++
等于2 ,侦听器将等待这些值,然后在mObsInt
方法中这些值与if语句匹配时执行您想做的事情现在,只需在您的asynctasks中,将onPostExecute()方法放入此行
mObsInt.set(mObsInt.get()+1);
因此,如果第一个异步完成mObsint == 1,如果第二个异步完成mObsInt == 2,那么您可以在onCreate方法中处理要执行的操作
希望这对您有帮助,对我有帮助
您可以通过以下文档获取更多信息:https://developer.android.com/reference/android/databinding/ObservableInt.html
快乐编码!
关于java - 两次异步操作后更新UI,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49926339/