【问题标题】:DeadObjectException with com.google.android.gmsDeadObjectException 与 com.google.android.gms
【发布时间】:2014-11-24 02:14:22
【问题描述】:

我经常因以下日志而崩溃。它没有引用我的应用程序代码,但我猜它可能与 GoogleApiClient 连接/断开连接有关。有人得到类似的东西吗?我在这里找不到任何东西。

java.lang.IllegalStateException: android.os.DeadObjectException
  at com.google.android.gms.internal.ao.removeAllListeners(Unknown Source)
  at com.google.android.gms.internal.ap.disconnect(Unknown Source)
  at com.google.android.gms.common.api.b.n(Unknown Source)
  at com.google.android.gms.common.api.b.a(Unknown Source)
  at com.google.android.gms.common.api.b$2.onConnectionSuspended(Unknown Source)
  at com.google.android.gms.internal.r.y(Unknown Source)
  at com.google.android.gms.internal.q$a.handleMessage(Unknown Source)
  at android.os.Handler.dispatchMessage(Handler.java:102)
  at android.os.Looper.loop(Looper.java:136)
  at android.app.ActivityThread.main(ActivityThread.java:5102)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:515)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
  at dalvik.system.NativeStart.main(Native Method)
Caused by: android.os.DeadObjectException
  at android.os.BinderProxy.transact(Native Method)
  at com.google.android.gms.internal.an$a$a.a(Unknown Source)
  ... 15 more

可能发生在哪里。我添加了一个 try/catch 来捕获异常

mGApiClientMgr.addTask(mGApiClientMgr.new GoogleApiClientTask() {
            @Override
            public void run() {
                Log.d(LOG_TAG, "Refreshing data set.");
                Location location;
                try {
                    location = LocationServices.FusedLocationApi.getLastLocation(getGoogleApiClient());
                    onLocationChanged(location);
                }
                catch(IllegalStateException ex) {
                    // TODO
                }
            }
        });

addTask 在哪里:

  private final LinkedBlockingQueue<GoogleApiClientTask> mTaskQueue = new LinkedBlockingQueue
        <GoogleApiClientTask>();

  mTaskQueue.offer(task);

【问题讨论】:

标签: android google-api


【解决方案1】:

这似乎与处理程序和消息传递有关...根据堆栈跟踪中的以下 sn-p,gms 在尝试使用循环器上的process a message 时看到DeadObjectException。即使堆栈跟踪显示与gms 相关,它也可能是由您的代码触发的。

   at com.google.android.gms.internal.q$a.handleMessage(Unknown Source)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:136)

如果尝试访问的message 属于已退出/终止的进程,则会看到此异常。通过代码搜索所有handler sendMessage* message dispatch calls。即使这样也可能无法捕获所有实例,因为某些 gms 调用可能会导致 handler 消息分派。

另外,检查您的任何后台服务或分配handler 消息的活动是否正在退出。 Android 可能正在摧毁它们depending on life cycle states, try overriding onDestroy

在你所有的活动/服务中,任何你调用gms api的地方,检查你创建的对象并传递给gms;如果他们死了,那些对象就不再有效了。

【讨论】:

  • 感谢您提供的信息。假设 sendMessage 导致它,我可以用 try-catch 包装它们中的每一个来捕获 IllegalStateException 吗?
  • 这无济于事,因为sendMessage 只是将对象移交给消息队列并返回。异常发生在很久以后,当gms 从消息队列中拉出对象时。同时,发送者可能已经退出或被android生命周期杀死。确保在更高的范围内分配对象或查看是否可以保留。
  • 一个潜在的解决方案是检测哪些 Activity 已被销毁,这与通过 Handler 在 Activity 和 Service 之间传递的对象相关。或者识别导致它的服务并在 Activity 被销毁时停止服务。这是解决方法吗?
  • @ono 是的,如果您可以检查并处理泄漏,肯定会有所帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-01
  • 1970-01-01
  • 2013-02-24
  • 2011-10-25
  • 2014-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多