1

hereから取得した AsyncTask ドキュメントを引用すると、それは言う

  • AsyncTask クラスを UI スレッドにロードする必要があります。これは、JELLY_BEAN の時点で自動的に行われます。
  • タスク インスタンスは、UI スレッドで作成する必要があります。
  • execute(Params...)UI スレッドで呼び出す必要があります。
  • onPreExecute()、、、onPostExecute(Result)を 手動でdoInBackground(Params...)呼び出さないでください。onProgressUpdate(Progress...)

UI Thread で AsyncTask 参照を作成する理由は何ですか? ルーパーの問題ですか?

4

3 に答える 3

2

そうすることは、ハンドラーが UI スレッドで初期化されていることを確認することだと思います。そのため、ハンドラーのコンストラクターで、myLooper() は mainUIThreadLooper を返し、後で送信されるメッセージは UI スレッドに配信されます。

public abstract class AsyncTask<Params, Progress, Result> {
    private static final InternalHandler sHandler = new InternalHandler();
....
}

public Handler() {
   ...
   mLooper = Looper.myLooper();
   ...
}
于 2012-11-07T09:05:49.910 に答える
1

AsyncTask は、UI スレッドでいくつかの準備を行い、別のスレッドで何かを実行してから、UI スレッドに結果を再度投稿するために特別に作成されているため、別の場所で AsyncTask を作成するのはかなり無意味だと思います。

于 2012-10-15T10:04:42.820 に答える
0

この回答を確認してください。

AsyncTask.class は静的フィールド参照ハンドラーを持っているため、UI スレッドにロードする必要があります。

private static final InternalHandler sHandler = new InternalHandler();

したがって、ルーパー ( NonMainThred )を使用して別のスレッドでAsynckTaskを初めて実行する場合、AsuncTask のすべてのインスタンスは、その onPostExecute (およびその他の) メソッドをその特定のNonMainThreadに投稿し、どこから AsyncTask を起動しようとしますか。

その onPostExecute から Android-UI 要素を処理しようとすると、次のエラーでクラッシュします。

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
于 2013-04-26T14:50:31.370 に答える