DeadObjectException与com.google.android.gms相关。

13

我经常遇到以下日志导致的崩溃。虽然它没有引用我的应用程序代码,但我猜测这可能与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);

你能展示一下你的GMS监听器代码片段吗? - ashoke
这是我找到的最接近的东西:https://dev59.com/eoDba4cB1Zd3GeqPIcE1 - ono
1个回答

7
这似乎与处理程序和消息传递有关...根据您的堆栈跟踪中的下面片段,当尝试在循环器上处理消息message时,gms发现了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)

如果正在访问的信息所属的进程已退出/终止,则会出现此异常。在代码中搜索所有 handler sendMessage* message dispatch calls,即可找到问题。但是这可能无法捕获所有实例,因为某些gms调用可能会导致handler消息分发。
另外,请检查是否有任何分配了handler消息的后台服务或活动正在退出。根据生命周期状态,Android可能会销毁它们(尝试覆盖onDestroy
在所有活动/服务中,无论何时调用gms api,请检查您创建并传递给gms的对象;如果它们死亡,则这些对象将不再有效。

谢谢提供这些信息。如果假设是sendMessage引起的问题,我能否只需用try-catch包装每个方法以捕获IllegalStateException异常? - ono
这并没有帮助,因为 sendMessage 只是将对象交给消息队列并返回。异常发生的时间要晚得多,当 gms 从消息队列中提取对象时。同时,发送者可能已经退出或被 Android 生命周期杀死。确保在更高的范围内分配对象或查看是否可以保留。 - ashoke
一个潜在的解决方案是检测与通过Handler在Activity和Service之间传递的对象相关联的已销毁的Activity。或者找出导致这种情况的Service,并在Activity被销毁时停止该服务。这是正确的做法吗? - ono
@ono 是的,如果您能够添加检查来检测泄漏并处理它们,那肯定会有所帮助。 - ashoke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接