我收到了大量来自强制关闭对话框中报告的用户的错误报告,这些对话框的状态如下:
java.lang.ExceptionInInitializerError
at com.MyRequest.execute(MyRequest.java:59)
at org.nsdev.MySyncAdapter.onPerformSync(MySyncAdapter.java:90)
at android.content.AbstractThreadedSyncAdapter$SyncThread.run(AbstractThreadedSyncAdapter.java:164)
Caused by: java.lang.RuntimeException:
Can't create handler inside thread that has not called Looper.prepare()
at android.os.Handler.<init>(Handler.java:121)
at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
at android.os.AsyncTask.<clinit>(AsyncTask.java:152)
现在,我一直在想我该如何最好地解决这个问题。在我的onperformsync实现中,我创建了许多异步任务并执行它们。我怀疑我的问题是,在从onperformsync返回之前,我没有等待这些任务完成。我试图做到以下几点:
Looper.prepare();
// Execute async tasks
Looper.loop();
然后我设置了一个计数器,当该计数器递减为零时,在异步任务的回调函数中调用looper.mylooper().quit()。
但是这样做会导致我的应用程序更难崩溃,出现以下运行时错误:
java.lang.RuntimeException: Main thread not allowed to quit
at android.os.MessageQueue.enqueueMessage(MessageQueue.java:175)
at android.os.Looper.quit(Looper.java:173)
at org.nsdev.MySyncAdapter$1.requestFinished(MySyncAdapter.java:89)
at com.MyAsyncTask.onPostExecute(MyAsyncTask.java:84)
at android.os.AsyncTask.finish(AsyncTask.java:417)
at android.os.AsyncTask.access$300(AsyncTask.java:127)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)
知道如何正确地完成同步吗?
最佳答案
我知道这篇文章已经过时了,但是对于遇到这个线程的其他人来说,不在主线程上调用looper.quit()怎么样?以下是一个syncadpater服务产生的几个异步任务,虽然在性能方面可能有其他原因不这样做…
Handler h = new Handler(Looper.getMainLooper());
h.post(new Runnable() {
public void run() {
// AsyncTask... execute();
}
});