2012-09-13 12 views
9

私はAsyncTaskを書きました。ほとんどの場合、コンストラクタとdoInBackgroundの間には遅延がありません(0ms遅延)。 しかし、バックグラウンドで連絡先の同期が行われているときは、AsyncTasksのコンストラクタとdoInBackgroundの間に1〜3秒の遅延が発生することがよくあります。この遅延は私の状況では受け入れられません。 AsyncTaskはバックグラウンドスレッドであることを理解しています。この問題は、スレッドを使用して優先度を高く設定することで解決できます。しかし、私が知りたいことは、AsyncTaskのdoInBackgroundが呼び出される原因を知るにはどうすればよいのでしょうか? adb shell top -m 10を使用しましたが、この問題が発生した場合、プロセスの使用状況はかなり正常に見えます。AsyncTaskのdoInBackgroundはAsyncTask :: executeが呼び出されたあと遅すぎます。

何か助けていただければ幸いです。

おかげ

+0

IMO、すぐに実行されます。別のスレッドも実行されている場合は、スレッドが遅くなり、スレッドをよく確認して同期をよくします。 – Tom

答えて

2

は、我々は一般的に、JVMによってタスクのスケジューリングについては気にしないでください。そして、本質的に私たちはまた気にする必要はありません。

アプリケーションでできるだけ早く行う必要がある場合は、コンストラクタ自体で行うか、onPre Asynctaskを使用します(UIスレッドで実行することを覚えておいてください)。

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

私はコアでTraditionalスレッドを使用し、onPreとonPostを模倣するために自分自身のAsynctaskを書きました。ハンドラを使用しました。あなたはそのオプションのために行くこともできます。

1

タスクの作成と実行を区別することが重要です。スレッドの作成(ASyncTaskあなたが気づいているように、別々の​​方法と同様に、コンストラクタを持っています。)

は、潜在的に非常に高価であるので、あなたは、事前にタスクを作成し、その後だけでそれを実行することがあります正確な時刻は、よりよい結果をもたらします。

バックグラウンド操作が頻繁に繰り返される可能性がある場合は、バックグラウンドスレッドで要求を1つずつ処理するIntentServiceが適していることがあります。

30

私もこの問題に長年取り組んでいますが、今解決しています。それは後半doInbackgroundを実行している問題を解決する代わりに

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

コード

new AsyncTaskName().execute(); 

下のコードを使用してください。

+1

これは私にとって完璧に機能しました。これはapi 11と警告から追加されたことに注意してください: 'http://developer.android.com/reference/android/os/AsyncTask.html#executeOnExecutorjava.util.concurrent.Executor、Params ...)' – Jayrox

+1

It executeOnExecutorを11以前のAPIバージョンで使用することはできません。スレッドを参照してください。http://stackoverflow.com/questions/9119627/android-sdk-asynctask-doinbackground-not-running-subclass/23678665#23678665 –

+0

@ミラノShukla:ありがとうございます:-) –

関連する問題