3

AsyncTask documentation 、スレッド化ルールの部分を読んでいるときに、次のことがわかりました。

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

「ロード」とはどういう意味ですか? ドキュメントで後で説明されているように、インスタンス化または実行ではありません。

4

1 に答える 1

6

この答えが実際に正しいとは思いません。

ドキュメントがインスタンス化読み込みを別々にリストすることは、それらが実際に同じである場合、意味がありません。この発言信じてる

AsyncTask クラスを UI スレッドにロードする必要があります。

Java Class Loadingを参照しています。つまり、AsyncTask クラス自体をメイン スレッドにロードする必要があります。Jelly Bean (またはそれ以降) では、これは自動です。ただし、古いバージョンの Android では、このクラスが別のスレッドに読み込まれる可能性があり、問題が発生する可能性があります。

詳細については、この Google ディスカッションを参照してください。基本的に、 が間違った (メインではない) スレッドに最初にロードさIntentServiceれる原因となる条件 (たとえば、 を使用するコード) があります。AsyncTask

Jelly Bean より前の最も簡単な修正方法は、次のようなものを使用することです。

Class.forName("android.os.AsyncTask");

アプリケーションのonCreate() メソッドで、必要なときにクラスのロードを強制的に実行します。


インスタンスを作成するAsyncTaskことは、おそらくあなたが思っていることです...インスタンス化します:

MyAsyncTask task = new MyAsyncTask();

これもメインスレッドで実行する必要があります。

于 2013-08-29T03:22:06.460 に答える