2016-04-24 11 views
2

私は2つのAsyncTaskを持っています:最初に素数を探して、成功すれば、単語 "Yop!"を表示する2番目のAsyncTaskを呼び出す必要があります。 (この単語を配列リストに追加し、AsyncTask 3で表示します)。私はonProgressUpdateから2番目AsyncTaskを呼び出す場合別のAsyncTaskからAsyncTaskを呼び出す方法は?

、私が持っているエラー:

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オブジェクトは既にコード上のどこかで実行されています。この

@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

のように感謝するあなたのMyTaskTwoクラスにonProgressUpdate()方法を変更しようと、それが仕事です! :) –

0

バックグラウンドスレッドの笙uldはUIを更新しません。 MyTaskFourはAsyncTaskには適切ではないようです。 AsyncTask.onPublishProgressはすでにUIスレッド上にあります。myTaskFour.execute();publishProgress();に置き換え、MyTaskFourを完全に削除する必要があります。

関連する問題