2016-09-18 226 views
-3

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

  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(); 
+0

你不应该像这样使用AsyncTask,如果你想加载一些数据,请尝试使用AsyncTaskLoader代替。 – Lazai

回答

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 
      } 
     } 
0

对于您必须禁用ButtonSpinner1DateFetcher方法onPostExecute调用new Spinner1DateFetcher和呼叫Second和相同Third Spinner方法和Third SpinneronPostExecute之前设置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

您的解决方案非常棒,但是每个AsyncTasks都有不同的参数。请看我编辑的问题。 –

+0

@AkshayJ看到我的更新答案。 – Ironman

+0

你的答案建议递归调用execute()函数。但是这3个电话的论点是不同的。我将如何处理这个问题。 –

0

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

例如,

class Spinner1DataFetcher extends AsyncTask<...> { 
     public Spinner1DataFetch(YourActivityOrFragment activity) { 
      _activity = activity; 
     } 

     protected void onPostExecute(...) { 
      _activity.spinner_1_is_done(); 
     } 
} 
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机制。