[英]update UI after two async operations
我在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
完成mObsInt
将等于1,如果其他asyncTask
完成这样mObsInt
会mObsInt++
,然后你mObsInt
将等于2,听众将等待的值,然后做你想做的事,当什么值与onCreate
方法中的if语句匹配
现在,只需在您的asynctasks中,将onPostExecute()方法放入此行
mObsInt.set(mObsInt.get()+1);
因此,如果第一个异步完成mObsint == 1,如果第二个异步完成mObsInt == 2,那么您可以在onCreate方法中处理要执行的操作
希望这对您有帮助,对我有帮助
您可以通过以下文档获取更多信息: https : //developer.android.com/reference/android/databinding/ObservableInt.html
编码愉快!
我在没有Rx /协程/其他东西的项目中使用的最简单方法。 只需创建AtomicInteger
。 用值初始化它等于异步操作数。 然后在异步函数的每个回调中调用此方法:
if(counter.decrementAndGet == 0) { your_final_action}
。
如果您需要其他帮助,例如我之前提到的方法,请随时问我。
这可以通过使用一个简单的变量来实现,如果两个数据都可以合并并从Firebase成功返回,则该变量将递增或保留一个标志。 但是,这既不是最好的方法,也不是一直有效,因为如果两个异步线程都试图同时更新标志,它可能会失败。 然后,使用上述给定的实现,只有在使整个操作成为线程安全的情况下才能起作用。
如果您考虑自己构建线程安全的实现,那也不是那么困难。 您可能只是考虑使用Synchronized
功能,该功能将更新您保留的标志,以检测是否从firebase提取了这两个数据。
但是,我建议您使用LocalBroadcastReceiver
完成您的实现。 这更易于实现,这是一个Android解决方案。 尽管可能还有其他几种很好的方法,但我认为使用BroadcastReceiver
的实现将完全满足您的目的。
您可以检查此答案以检查BroadcastReceiver
的实现。 从Firebase提取数据的第一部分后,将广播发送给BroadcastReceiver
在您的Activity
接收,并设置一个标志值,例如1。然后,在接收到第二部分时,您必须将值设置为通过从Firebase获得响应时仅发送广播来再次返回2。 然后,在找到值2时,这意味着两个操作均已完成,现在您可以合并两个列表。
为了避免总体上的线程安全和故障安全编码开销,您可以考虑同步从Firebase提取数据。 在获取第一部分的数据后,启动第二部分的获取操作,以更好地控制您的代码。
我刚刚提出了一些想法,请选择任何适合您的想法。 希望有帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.