2015-05-02 25 views
6

我試圖按順序執行相同的Asynctask。例如,讓我們有一個Asynctask A。現在假設A檢查某個服務器是否忙碌。如果它很忙,它會再次檢查....等等。假設它檢查5次,然後讓用戶知道服務不可用。
顯然可以使用相同的Asynctask。
試圖用循環來實現它可能會產生意想不到的結果作爲根據本 link
的AsyncTask是一種發射後不管的實例和實例的AsyncTask只能使用一次。
所以循環5次意味着Asynctask將被調用5次。但是如果服務器在第二次嘗試時是免費的,我不需要額外的檢查。此外,Android應用程序可能會掛起(我的)。糾正我,如果我在這個話題上錯了。
按順序多次運行相同的Asynctask

而且得到的答覆是,「calling task like new MyAsyncTask().execute("");
所以,如果我不喜歡這一點 - 例如,

new someAsyncTask() { 
      @Override 
      protected void onPostExecute(String msg) { 
       new someAsyncTask() { 
        @Override 
        protected void onPostExecute(String msg) { 
         ....and so on 5 times. 
        } 
       }.execute(this); 
      } 
     }.execute(this); 

應當依次呼叫5次,應該不會出現問題。
這是做這個還是其他解決方案存在的唯一方法?

回答

4

您可以在外部類中使用一個字段變量:

private int count; 
private void attemptConnect(){ 
    count = 0; 

    new MyTask().execute(""); 
} 

class MyTask extends AsyncTask<String, String, String> { 
    @Override 
    protected String doInBackground(String... params) { 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String s) { 
     count++; 
     if(count < 5){ 
      new MyTask().execute(""); 
     } 
    } 
} 

還是以計數傳遞給的AsyncTask構造:

private void attemptConnect(){ 
    new MyTask(0).execute(""); 
} 

class MyTask extends AsyncTask<String, String, String> { 
    private int count; 

    public MyTask(int count){ 
     this.count = count; 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String s) { 
     if(count < 4){ 
      new MyTask(++count).execute(""); 
     } 
    } 
} 
+0

如果我使用匿名的AsyncTask將這項工作? 我的意思是在我提供的問題中,我在其他java類中實現了asynctask類。我只是用在另一個班上。這會在那裏工作嗎?因爲那樣我就不得不再次寫'onPostExecute'。 –

+0

我發佈了一個適用於獨立類的替代方案。 – tachyonflux

+0

但我使用匿名Asynctask。並且在onPostExecute的獨立類中沒有被覆蓋。最重要的是在另一個班上完成的。如果onPostExecute位於獨立類上,您提供的示例將可用。但它會在匿名Asynctask上工作嗎? –