繁体   English   中英

两次异步操作后更新UI

[英]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完成这样mObsIntmObsInt++ ,然后你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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM