3

状況は非常に単純です。AsyncTaskを使用してHttpClientから文字列を取得します。

ここで、AsyncTaskによって取得された文字列が、その文字列で別のメソッドを呼び出す必要があります。

したがって、他のメソッドを呼び出す前に、AsyncTaskが終了していることを確認する必要があります。

どうすればよいですか?

提案をありがとう。

4

5 に答える 5

2

単純なロックまたはミューテックスを使用します。基本的に、変数とゲッターをAsyncTask:に追加します。

public boolean locked;

public boolean isLocked(){
    return locked;
}

AsyncTaskonPreExecuteメソッドに、次を追加します。

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.
于 2013-02-28T14:09:03.123 に答える
1

それが「終了」したかどうかは実際には気にしないのではないかと思います。doInBackgroundメソッドが完了したかどうかだけ気になっていると思います。最も簡単な答えは、onPostExecuteまたはonCancelledのいずれかが呼び出された場合、doInBackgroundが実行されるということです。もっときめ細かいものが必要な場合は、Philが説明するようなことをする必要があります。

private volatile boolean done;

//...

public boolean isDone() { return done; }

protected Result doInBackground(Params... params) {
    // ...
    done = true;
    return result;
}
于 2013-02-28T14:47:14.567 に答える
1

どうしても値が必要な場合は、(AsyncTaskの実行ではなく)新しいスレッドを起動し、.joinメソッドを使用してスレッドが終了するのを待つこともできます。

通常は眉をひそめますが(httpリソースにそのようにアクセスするべきではありません。応答しないアプリが発生するリスクがあります)、他の提案されたソリューションと大きな違いはありません。

于 2013-02-28T14:12:15.520 に答える
1

onPostExecute()がすでに呼び出されているかどうかを確認してください

于 2013-02-28T14:06:45.057 に答える
1

何をしたいのか...メインスレッドが5秒間ブロックされている場合、ユーザーは、ユーザーがもっと長く待つか、アプリケーションを終了するかを尋ねるプロンプトを受け取ります。

于 2013-02-28T14:22:54.713 に答える