13

AsyncTask を作成しましたが、ほとんどの場合、コンストラクターが呼び出されてから doInBackground が呼び出されるまでの間に遅延はありません (0 ミリ秒の遅延)。しかし、連絡先の同期がバックグラウンドで行われているときはいつでも、AsyncTasks のコンストラクターと doInBackground の間に 1 ~ 3 秒の遅延が発生することがよくあります。私の状況では、この遅延は受け入れられません。AsyncTask はバックグラウンド スレッドであり、この問題は Thread を使用してその優先度を高く設定することで解決できることを理解しています。しかし、私が知りたいのは、AsyncTask の doInBackground が呼び出されない原因をどのように知ることができるかということです。私は adb shell top -m 10 を使用しましたが、この問題が発生したときのプロセスの使用はごく普通のようです。

どんな助けでも大歓迎です。

ありがとう

4

3 に答える 3

39

私もこの問題に長い間直面していましたが、現在は解決されています。以下のコードを使用してください

new AsyncTaskName().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

代わりにコード

new AsyncTaskName().execute();

doInbackground を遅く実行するという問題を解決します。

于 2013-03-13T12:02:12.423 に答える
2

通常、jvmによるタスクのスケジューリングについては気にしません。実際、私たちも気にする必要はありません。

アプリケーションで可能な限り迅速に実行する必要がある場合は、コンストラクター自体で実行するか、AsynctaskのonPreを使用します(UIスレッドで実行することを忘れないでください)。

しかし、Android AsyncTaskでのdoInBackgroudの呼び出しには、何か怪しいものがあることに同意します。私自身、onPreの後にdoInbackgroundが呼び出されないのを目撃しました。これもグーグルできます。多くの人がそれに直面していました。従来のスレッドを使用するように移動しました。

従来のスレッドをコアとして使用し、onPreとonPostを模倣するために、ハンドラーを使用して独自の非同期タスクを作成しました。あなたもそのオプションに行くことができます。

于 2012-09-13T11:06:38.913 に答える
1

タスクの作成と実行を区別することが重要です。(お気づきのように、AnASyncTaskには別のメソッドとコンストラクターがあります。)execute()

スレッドの作成にはかなりの費用がかかる可能性があるため、事前にタスクを作成してから、正しい時間にのみ実行すると、より良い結果が得られる場合があります。

IntentServiceバックグラウンド操作が頻繁に繰り返される可能性がある場合は、バックグラウンドスレッドで一度に1つずつリクエストを処理するがより適切であることがわかる場合もあります。

于 2012-09-13T11:07:18.773 に答える