Android中的BroadcastReceiver中的AsyncTask在死线程错误时向Handler发送消息

sun*_*nil 1 android exception broadcastreceiver android-asynctask

我已在我的应用程序中实现了推送通知.收到推送消息后,我在AsyncTask的帮助下调用web服务.这在使用应用程序或在内存中时工作正常.但是,如果我从设置中停止应用程序,然后如果将消息推送到设备,则会出现异常,例如"在死线程上向处理程序发送消息".这可能是因为应用程序不在线.

有人能让我知道它是否可以从推送通知接收器中实际删除AsyncTask并只处理消息?

关心Sunil

Jon*_*low 10

这是由于Android框架中的AsyncTask中存在错误.AsyncTask.java具有以下代码:

private static final InternalHandler sHandler = new InternalHandler();
Run Code Online (Sandbox Code Playgroud)

它期望在主线程上初始化它,但是这不能保证,因为它将在导致类运行其静态初始化器的任何线程上初始化.我重现了Handler引用工作线程的问题.

导致这种情况发生的常见模式是使用IntentService类.C2DM示例代码执行此操作.

一个简单的解决方法是将以下代码添加到应用程序的onCreate方法:

Class.forName("android.os.AsyncTask");
Run Code Online (Sandbox Code Playgroud)

这将强制在主线程中初始化AsyncTask.我在android bug数据库中提交了一个bug.请参阅http://code.google.com/p/android/issues/detail?id=20915.