0

最近、経験豊富な人にとっては簡単に見えるかもしれないが、私には理解するのが非常に難しいエラーに遭遇することが増えています。

X 分ごとに新しいフィード エントリをチェックするバックグラウンド サービスを作成しようとしています。したがって、私はサービスからループを開始しています。そのループは asynctask を作成します。

私の 4.1 フォンでは魅力的に動作しますが、私の 2.3 エミュレーターでは次のように強制終了します。

09-11 19:53:35.905: E/AndroidRuntime(354): FATAL EXCEPTION: AppConstructorPushLoop
09-11 19:53:35.905: E/AndroidRuntime(354): java.lang.ExceptionInInitializerError
09-11 19:53:35.905: E/AndroidRuntime(354):  at com.appconstructor.actest.PushNotificationService$1.run(PushNotificationService.java:54)
09-11 19:53:35.905: E/AndroidRuntime(354):  at java.util.Timer$TimerImpl.run(Timer.java:284)
09-11 19:53:35.905: E/AndroidRuntime(354): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
09-11 19:53:35.905: E/AndroidRuntime(354):  at android.os.Handler.<init>(Handler.java:121)
09-11 19:53:35.905: E/AndroidRuntime(354):  at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
09-11 19:53:35.905: E/AndroidRuntime(354):  at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
09-11 19:53:35.905: E/AndroidRuntime(354):  at android.os.AsyncTask.<clinit>(AsyncTask.java:152)
09-11 19:53:35.905: E/AndroidRuntime(354):  ... 2 more

これは通常、UI 以外のスレッドで UI を実行しようとしていることを意味しますが、そうではありません。実際、ASyncTask のすべてのアクティビティをコメントアウトしても、強制的に閉じられます。ループを開始する行をコメントアウトすると、強制終了が停止するだけです

これは私の 2.3 エミュレーターでのみ発生し、私が使用している 4.0 スタイルの通知とは関係ありません。

誰かがこれについてもっと知っていますか?

ありがとう!

edit -> Looper.prepare() を呼び出すと、スレッドごとに 1 回だけ発生する可能性があるというエラーが表示されます。

4

2 に答える 2

1

http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable ) メソッドAsyncTaskから開始してください。そして Service - UI スレッドでインスタンスを作成し、 http://developer.android.com/reference/android/os/Handler.html#post(java.lang.Runnable ) で開始ますnew Handler()AsyncTask

于 2012-09-11T11:37:35.437 に答える
1

タイマーからUIトレッドを更新しています。タイマー内にトーストを入れるだけでは機能しません.タイマーはUIスレッドにアタッチされておらず、thread.executeを呼び出したときにスレッドを2回準備できないためです。準備し、4.1 では Android OS 自体で処理します。AsyncTask は UI スレッドからのみ呼び出すことができます。

new refreshList().execute();

このコードを runOnUiThread(action) 内で実行し、新しいスレッドを実行する前にスレッドをキャンセルすることを忘れないでください。

于 2012-09-11T13:03:52.553 に答える