2016-09-18 225 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機制。