2016-04-24 84 views
2

我有兩個AsyncTask:首先尋找一個素數,如果成功,我必須調用第二個顯示單詞「Yop!」的AsyncTask。 (將這個單詞添加到數組列表中,並顯示在AsyncTask中)。如何從另一個AsyncTask調用AsyncTask?

如果我把第二的AsyncTask從onProgressUpdate,我有錯誤:

Process: com.egoriku.asynctask, PID: 3274 
                    java.lang.IllegalStateException: Cannot execute task: the task has already been executed (a task can be executed only once) 
                     at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:605) 
                     at android.os.AsyncTask.execute(AsyncTask.java:560) 
                     at com.egoriku.asynctask.activities.MainActivity$MyTaskTwo.onProgressUpdate(MainActivity.java:175) 
                     at com.egoriku.asynctask.activities.MainActivity$MyTaskTwo.onProgressUpdate(MainActivity.java:153) 
                     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:680) 
                     at android.os.Handler.dispatchMessage(Handler.java:102) 
                     at android.os.Looper.loop(Looper.java:148) 
                     at android.app.ActivityThread.main(ActivityThread.java:6066) 
                     at java.lang.reflect.Method.invoke(Native Method) 
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:770) 
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:660) 

MyTaskOne:

private class MyTaskTwo extends AsyncTask<Void, Integer, Void> { 

    public MyTaskTwo() { 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     super.onPostExecute(aVoid); 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     Log.e("T2", "onProgressUpdate"); 
     super.onProgressUpdate(values); 
     tempListMessages.add(hintThreadTwo + " " + String.valueOf(values[0])); 
     Log.e("T2", "add to list"); 
     myTaskFour.execute(); 
     Log.e("T2", "tast 3 execute"); 
     Log.e("T2", "end"); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     Log.e("T2", "doInBackground"); 
     int nowDigit = 1; 
     while (!isCancelled()) { 
      boolean flag = true; 

      for (int i = 2; i < nowDigit; i++) { 
       if (nowDigit % i == 0) { 
        flag = false; 
       } 
      } 

      if (flag) { 
       try { 
        Thread.sleep(450); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       callThreadFour = true; 
       publishProgress(nowDigit); 
      } 
      nowDigit++; 
     } 
     return null; 
    } 
} 

MyTaskTwo

rivate class MyTaskFour extends AsyncTask<Void, Void, Void> { 
    public MyTaskFour() { 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     Log.e("T4", "doInBackground"); 
     publishProgress(); 
     return null; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     Log.e("T4", "onPostExecute"); 
     super.onPostExecute(aVoid); 
    } 

    @Override 
    protected void onProgressUpdate(Void... values) { 
     Log.e("T4", "onProgressUpdate"); 
     super.onProgressUpdate(values); 
     tempListMessages.add(hintThreadFour + " " + textThreadFour); 
     callThreadFour = false; 
    } 
} 

回答

2

myTaskFour對象已經在您的代碼的某處執行。嘗試更改MyTaskTwo類中的onProgressUpdate()方法如下所示

@Override 
protected void onProgressUpdate(Integer... values) { 
    Log.e("T2", "onProgressUpdate"); 
    super.onProgressUpdate(values); 
    tempListMessages.add(hintThreadTwo + " " + String.valueOf(values[0])); 
    Log.e("T2", "add to list"); 
    new MyTaskFour.execute(); // creates a new MyTaskFour instance 
    Log.e("T2", "tast 3 execute"); 
    Log.e("T2", "end"); 
} 
+0

謝謝,它的工作! :) –

0

後臺線程笑不會更新用戶界面。它看起來像MyTaskFour不適用於AsyncTask。 AsyncTask.onPublishProgress已經在UI線程上,你應該簡單的用替換publishProgress();並且完全擺脫MyTaskFour。