0

最近,我遇到了越来越多的错误,这些错误对于有经验的人来说似乎很容易,但对我来说却很难弄清楚。

我正在尝试创建一个后台服务,每 X 分钟检查一次新的提要条目。因此,我从服务开始一个循环,并且该循环创建了一个异步任务。

它在我的 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 样式通知无关。

有人会对此有更多了解吗?

谢谢!

编辑-> 如果我调用 Looper.prepare() 我会得到每个线程可能只发生一次的错误。

4

2 回答 2

1

AsyncTaskhttp://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable ) 方法开始。并使用服务 -new Handler()在 UI 线程上创建实例并AsyncTaskhttp://developer.android.com/reference/android/os/Handler.html#post(java.lang.Runnable )上启动

于 2012-09-11T11:37:35.437 回答
1

您正在从计时器更新 UI 踏板,如果您只是在计时器内放了一个吐司,它将无法工作,因为计时器没有与 UI 线程连接,并且您无法在调用 thread.execute 时两次准备线程准备并在 4.1 中由 android OS 本身处理。AsyncTask 只能从 UI 线程调用。

new refreshList().execute();

在 runOnUiThread(action) 中运行此代码,并且不要忘记在执行新线程之前取消线程。

于 2012-09-11T13:03:52.553 回答