2012-03-21 9 views
1

を起動していない私は、以下のようにAsyncTaskを書いています:AsyncTaskはonPostExecute()

class Load extends AsyncTask<String, String, String> { 
@Override 
protected void onPreExecute() { 
super.onPreExecute(); 
} 
@Override 
protected String doInBackground(String... aurl) { 
//do job seconds 
//stop at here, and does not run onPostExecute 
} 
@Override 
protected void onPostExecute(String unused) { 
super.onPostExecute(unused); 
wait = false; 
new Load().execute(); 
} 
} 

、以下のように他の方法:

public void click() { 
new Load().execute(); 
while(wait) { 
; 
} 
} 

待ち時間がグローバルブール値です。

答えて

4

このコード:タスクの実行中

public void click() { 
new Load().execute(); 
while(wait) { 
; 
} 
} 

は、UIスレッドをブロックします。これは、フォアグラウンドでバックグラウンドタスクを実行するだけでなく、アプリケーションが応答しない(ANR)エラーを引き起こすほど悪いことです。しないでください。

AsyncTask.onPostExecute()は、タスクがキャンセルされても呼び出されないことに注意してください。 doInBackgroundが例外をスローした場合にも呼び出されません。 doInBackgroundで起こっていることは、これを引き起こしている可能性があります。

3

これは、あなたがproppar道のasynctask他の方法にウェイトを使用するように習慣や睡眠であり、両方とも
あなたdoInBackground()方法はExceptionを投げているように、同じ通常の方法

private class AsyncTask extends AsyncTask<Void, Void, Void> { 
     ProgressDialog progressDialog; 

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

     } 

     @Override 
     protected Void doInBackground(Void... params) { 

     } 

     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 
      progressDialog.dismiss(); 

     } 
    } 
2

が見える 使用は、それを入れてみてくださいブロックtry-catch
また、なぜsuper.onPostExecute()に電話しているのか分かりませんが、これも削除してみてください。この文を使用する必要はありません。

2

while(wait){}ループがUIスレッドをブロックしています。 onPostExecuteはUIスレッドで実行されます。ブロックしているので、onPostExecuteは決して実行できません。さらに、LoadAsyncTaskの新しいインスタンスを作成し、onPostExecuteで実行すると、ある時点でキャンセルしない限り、無限ループを繰り返すことになります。

関連する問題