【问题标题】:AsyncTask in BroadcastReceiver in Android gives sending message to a Handler on a dead thread errorAndroid 中 BroadcastReceiver 中的 AsyncTask 在死线程错误时向 Handler 发送消息
【发布时间】:2011-09-06 12:36:14
【问题描述】:

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

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

问候 苏尼尔

【问题讨论】:

    标签: android exception android-asynctask broadcastreceiver


    【解决方案1】:

    这是由于 Android 框架中的 AsyncTask 中的错误造成的。 AsyncTask.java 代码如下:

    private static final InternalHandler sHandler = new InternalHandler();
    

    它希望在主线程上初始化它,但这不能保证,因为它会在恰好导致类运行其静态初始化程序的任何线程上初始化。我在 Handler 引用工作线程时重现了这个问题。

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

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

    Class.forName("android.os.AsyncTask");
    

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

    【讨论】:

    • 谢谢。在我的情况下,GCM 在 4.1 的 Nexus7 上运行良好,但在 2.3 的 Kobo 上运行良好。如果没有您的亲切和知识渊博的指导,我永远不会找到这个
    【解决方案2】:

    IMO AsyncTask 应仅用作与活动相关的后台任务(即 UI)的助手。

    在您的情况下,我将使用 IntentService,它是一个准备执行后台任务的服务。所以:

    1. 向设备推送新通知。
    2. 您会在广播接收器中收到通知。
    3. 您触发 IntentService 以针对 WS 执行同步
    4. IntentService 完成其工作,完成后引发广播事件。

    在您的 Activity 中为第 4 步中的广播附加一个广播接收器。这样,如果它存在,您的 UI 就会收到通知,否则不会发生任何不好的事情。或者,您可以在 Manifest 中注册默认广播接收器来处理步骤 4 的广播,例如,显示状态栏通知。

    【讨论】:

    • 我只使用了 BroadcastReceiver。我的意思是 C2DMReceiver 将接收推送消息。我希望只在 C2DMReceiver 中做所有事情而不调用任何 IntentService。
    • 对不起,我听不懂你的话:/
    • 我的意思是我没有使用任何 IntentService 并且仅使用广播在 BroadcastReceiver 中执行任务,因为我认为广播接收器不会阻塞 UI。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 2018-01-16
    • 2013-06-18
    • 1970-01-01
    • 2019-08-30
    • 2012-05-24
    相关资源
    最近更新 更多