Android AsyncTask で問題があります。TextView、ボタン、画像を含むアクティビティがあります。ユーザーがこのアクティビティに入ると、ユーザーがアクティビティから移動できるかどうかを確認するために asynctask を開始します (タスクが終了し、ボタンがアクティブにならないまで)。次に、画像を取得するために別の asyntask を開始します。そこで、内部クラスを作成しました。
AsyncTask<String, Void, JSONObject>() authTask = new AsyncTask<String, Void, JSONObject>() {
@Override
protected JSONObject doInBackground(String... params) {
//call the rest api
}
@Override
protected void onPostExecute(JSONObject result) {
// check the result
// and make another asynctask
AsyncTask<String, Void, Bitmap> imageTask = new Async.... {
// get image
}
imageTask.execute();
}
}
authTask.execute();
UI スレッドから呼び出します。
これについては嫌な予感がします。特に、うまくいかないようです (数回は問題ありませんが、突然「フリーズ」します。例外なく、ハングしたまま進行状況バーが回転します。何も起こらず、ボタンはアクティブになりません)。情報を取得し、完了したらすぐに別のタスクを開始する別の方法はありますか?
更新: API レベル 10 で作業しています。authTask では、imageTask (何らかの ID) を開始するために必要な情報を取得するため、これらのタスクを連続して呼び出す必要があります。API レベル 10 では可能ですか?
前もって感謝します!
ピーター
ベストアンサー1
getStatus()
が保留中、実行中、または完了しているかどうかをチェックし、完了AsyncTask
したら新しいタスクを開始できます。次のようにします。
if(authTask .getStatus() == AsyncTask.Status.PENDING){
// My AsyncTask has not started yet
}
if(authTask .getStatus() == AsyncTask.Status.RUNNING){
// My AsyncTask is currently doing work in doInBackground()
}
if(authTask .getStatus() == AsyncTask.Status.FINISHED){
// START NEW TASK HERE
}
アプリの例:
btn.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
if (authTask != null && authTask.getStatus() == AsyncTask.Status.FINISHED) {
//START YOUR NEW TASK HERE
}
else
{
//IGNORE BUTTON CLICK
}
}
});