0

AsyncTaskとTimerTaskは、異なるAPIバージョン間で同じように動作しないことがわかりました。

これが私の設定です:TimerTaskは時々起動するように設定されています。TimerTaskが起動したときにメソッドが呼び出されるサービスがあります。このメソッドは、バックグラウンド処理のためにAsyncTaskをインスタンス化します。AsyncTaskはUIに触れないことに注意してください。

上記はすべてAndroidAPI16および17で正常に機能しますが、低レベルのAPIでは失敗し、標準の「ハンドラーを作成できません... Looper.prepare()」エラーが発生します。たとえば、TimerTaskでAsyncTaskを開始します。

これを回避するには、AsyncTaskをRunnableに変更してから、サービスのメソッドで新しいスレッドを手動で開始します。しかし、バージョン16以降のAPIで何が変更されたのでしょうか。Looper.prepare()は実際にTimerTaskスレッドで呼び出されていますか?もしそうなら、TimerTaskを使い続けることができるようにコードに同じことを実装する簡単な方法はありますか(後でAsyncTaskからUIを更新することを決定する可能性があるため、Runnableソリューションは多くの点で最適ではありません)。

ありがとう、

Veljko

4

2 に答える 2

0

アクションのスケジュールにはアラームサービスを使用し、アクションのスケジュールにはインテントサービスを使用することをお勧めします。UIに触れる必要がないため、作業が簡単になります。

于 2013-03-25T11:29:44.827 に答える
0

問題は、UIスレッドで最初のスレッドを作成していないことである可能性がありAsyncTaskます。これは、後で作成されるすべてのAsyncTaskに影響します。この質問を見てください-onPostExecuteがAsyncTaskで呼び出されていません(ハンドラーランタイム例外)

回避策は、ApplicationクラスからAsyncTaskをロードすることです。

下位レベルのAPIでのAsyncTaskの動作も異なります。非同期タスクは、高レベルのAPIで一度に1つのタスクを実行するのではなく、実際には低レベルのAPIで同時に実行されます。それが要因かもしれません。

非同期タスクは、UIを更新する必要がある場合にのみ必要です。これが、クラスの前後の操作の目的です。UIの更新がない場合、Runnableの使用は完全に問題ありません。Runnablesの処理が完了した後、Runnablesがぶらぶらしないように注意してください。

@ Atrix1987が提案するようにアラームを使用できますが、スケジュール時間が15分を超える場合にのみアラームを使用します(これはまだ当てはまる可能性があります)。その理由については、別の質問で説明しました-Androidでの定期的なタスクのスケジュール

于 2013-03-25T11:40:38.253 に答える