等待AsyncTask完成

时间:2016-09-18 10:39:17

标签: android android-asynctask

在OnCreate方法中,我调用了3个AsyncTask,它基本上填充了3个Spinners的数据。我需要的是我应该禁用“登录”按钮,直到完成所有3个任务。我怎样才能做到这一点?

            new SpinnerDataFetcher("GetFreeDrivers1",(Spinner)findViewById(R.id.Spinner_1)).execute();

            new SpinnerDataFetcher("GetFreeDrivers2",(Spinner)findViewById(R.id.Spinner_2)).execute();

            new SpinnerDataFetcher("GetFreeDrivers3",(Spinner)findViewById(R.id.Spinner_3)).execute();

4 个答案:

答案 0 :(得分:0)

为此,您必须在致电Button之前停用new Spinner1DateFetcher并从Second方法Spinner1DateFetcher拨打onPostExecute并与Third Spinner方法相同在Third Spinner onPostExecute设置ButtonEnable ..

禁用按钮使用

Button.setEnabled(false); 

启用按钮使用

   Button.setEnabled(true); 

修改:

对于参数检查,您必须添加Constuctor并检查条件如下。

private class MyAsyncTask extends AsyncTask<Void, Void, Void> {

    public MyAsyncTask(boolean showLoading) {
        super();
        // do stuff
    }

    // doInBackground() et al.
}

答案 1 :(得分:0)

使用对创建它的Activity / Fragment的引用初始化您的AsyncTask实例。然后在onPostExecute完成时发出信号

e.g。

2 > 100

答案 2 :(得分:0)

只需增加与完成AsyncTask的次数相对应的数字。

        int s = 0;

        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            new SpinnerDataFetcher(){
               @Override
                protected void onPostExecute(....) {
                   super.onPostExecute(...);
                   s++;
                   check();
                }

            }.execute(); 

            new SpinnerDataFetcher(){
               @Override
                protected void onPostExecute(....) {
                   super.onPostExecute(...);
                   s++;
                   check();
                }

            }.execute(); 

            new SpinnerDataFetcher(){
               @Override
                protected void onPostExecute(....) {
                   super.onPostExecute(...);
                   s++;
                   check();
                }

            }.execute(); 

        }

        public void check(){
          if(s >=3){
             s= 0;
            // enable button here
          }
        }

答案 3 :(得分:0)

有多种方法可以实现这一目标。

实现此目的的直接方法是创建一个触发UI更新的计数器。

final InterfaceTrigger trigger = new InterfaceTrigger();

new AsyncTask<>() {
    @Override
    protected void onPostExecute(Object o) {
        super.onPostExecute(o);
        trigger.finishJob();
        if (trigger.isTimeToUpdateUi()) {
           // TODO update your UI
        }
    }
    };

public class InterfaceTrigger {
    private static final int THRESHOLD = 3;
    private int counter;

    public synchronized void finishJob() {
        counter++;
    }

    public synchronized boolean isTimeToUpdateUi() {
        return counter == THRESHOLD;
    }
}

另一种方法是使用CyclicBarierExcutorService机制。