状況は非常に単純です。AsyncTaskを使用してHttpClientから文字列を取得します。
ここで、AsyncTaskによって取得された文字列が、その文字列で別のメソッドを呼び出す必要があります。
したがって、他のメソッドを呼び出す前に、AsyncTaskが終了していることを確認する必要があります。
どうすればよいですか?
提案をありがとう。
状況は非常に単純です。AsyncTaskを使用してHttpClientから文字列を取得します。
ここで、AsyncTaskによって取得された文字列が、その文字列で別のメソッドを呼び出す必要があります。
したがって、他のメソッドを呼び出す前に、AsyncTaskが終了していることを確認する必要があります。
どうすればよいですか?
提案をありがとう。
単純なロックまたはミューテックスを使用します。基本的に、変数とゲッターをAsyncTask
:に追加します。
public boolean locked;
public boolean isLocked(){
return locked;
}
AsyncTask
のonPreExecute
メソッドに、次を追加します。
locked = true;
そして、onPostExecute
メソッドに以下を追加します。
locked = false;
次に、外部メソッドを次のようなループに配置できます。
MyTask foo = new MyTask();
foo.execute();
while (foo.isLocked())
{
//wait, or sleep, or whatever
}
//here is where you execute code.
それが「終了」したかどうかは実際には気にしないのではないかと思います。doInBackgroundメソッドが完了したかどうかだけ気になっていると思います。最も簡単な答えは、onPostExecuteまたはonCancelledのいずれかが呼び出された場合、doInBackgroundが実行されるということです。もっときめ細かいものが必要な場合は、Philが説明するようなことをする必要があります。
private volatile boolean done;
//...
public boolean isDone() { return done; }
protected Result doInBackground(Params... params) {
// ...
done = true;
return result;
}
どうしても値が必要な場合は、(AsyncTaskの実行ではなく)新しいスレッドを起動し、.joinメソッドを使用してスレッドが終了するのを待つこともできます。
通常は眉をひそめますが(httpリソースにそのようにアクセスするべきではありません。応答しないアプリが発生するリスクがあります)、他の提案されたソリューションと大きな違いはありません。
onPostExecute()がすでに呼び出されているかどうかを確認してください
何をしたいのか...メインスレッドが5秒間ブロックされている場合、ユーザーは、ユーザーがもっと長く待つか、アプリケーションを終了するかを尋ねるプロンプトを受け取ります。