我在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/

10-09 12:54