2

サーバーでdb4oを更新するためにAsyncTaskを使用したいと思います。doInBackgroundメソッドで、サーバーに接続し、db4oを更新して、pendingintentsをスケジュールします。UIを変更したり、トーストを表示したりしないでください。

最初に、次のエラーが発生しました。

Can't create handler inside thread that has not called Looper.prepare() 

Looper.prepare()を追加した後、正常に動作しますが、5回の更新(AsyncTask)に対してのみです。私はこのトピックを読みました:AsyncTaskスレッドは決して死ぬことはありません(Android)、そして私は今それが失敗することはありません。6番目の更新をスローすると、アプリがクラッシュします。

FATAL EXCEPTION: AsyncTask #1
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:200)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
at java.lang.Thread.run(Thread.java:1019)
Caused by: java.lang.RuntimeException: Only one Looper may be created per thread
at android.os.Looper.prepare(Looper.java:74)
(...)

5つのAsyncTask

Looper.loop()が必要であるというドキュメントを読みましたが、これでアプリがクラッシュします。

例:

protected Integer doInBackground(Void... params) {
    Looper.prepare();

        update = new Update();
        update.checknewObjects();
        update.deleteOldObjects();
        update.updateObjects();
        Looper.loop();
}

なぜルーパーが必要なのですか?5回の更新後にアプリがクラッシュするのはなぜですか?Looper.loop()はどこでスケジュールできますか?

前もって感謝します!

4

3 に答える 3

0

タスクをスケジュールしたい場合は、Timer と TimerTask を使用する必要があります。私が理解していることから、ニーズにより適していると思います。 http://developer.android.com/reference/java/util/Timer.html

于 2012-10-30T14:01:40.537 に答える
0

使いたいから使うAsyncTaskなら混ぜてはいけないLopper

protected Integer doInBackground(Void... params) {}

すでにバックグラウンド スレッドで作業しており、Lopper を呼び出す理由はありません。何のために?

アプリケーションがある種の長い計算を行う必要がある場合、非常に優れたツールです。これは、アプリケーションを使用するすべてのユーザーがアプリケーションが「何かをしている」ことを知っている必要があるため、作業の進行状況に応じて更新できるAsyncTaskメソッドを提供するためです( 2 ~ 5 秒以上かかる場合)。UI ThreadUI

また、それは一般的であり、いくつかの利点があります。

更新する必要がない場合はUI、たとえばを使用してHandlerください。

于 2012-10-30T14:10:19.503 に答える
0

非同期タスクでは、バックグラウンド関数でループを使用できません。エラーが発生します

于 2012-10-31T09:29:12.683 に答える