在Android中,我们有一个类来包装GMS(Google Mobile Services)的LocationClient对象。(请注意,LocationClient实现了com.google.android.gms.common.GooglePlayServicesClient。)不幸的是,LocationClient对象有抛出DeadObjectExceptions的习惯(例如当我们调用locationClient.getLastLocation()时),我们通过几个日志机制检测到这一点。然而,奇怪的是,LocationClient没有被记录为抛出DeadObjectExceptions,而且我只能 ~ 1/40的时间捕获到这些DeadObjectExceptions。我们无法重现此问题,我个人从未见过它,但它发生在大量用户身上。
其他注意事项:
[a] "Caused by: java.lang.IllegalStateException: android.os.DeadObjectException"这行是什么意思?这两种异常类型没有祖先后代关系
[b] 我在Android论坛上发布了帖子,但他们将我的帖子拒绝为“错误的论坛”,而且没有GMS论坛,所以我完全没有运气。
总之,问题是:GMS触发了这种奇怪的无法捕获的异常,那么这是怎么回事,我该怎么做?
其他注意事项:
[a] "Caused by: java.lang.IllegalStateException: android.os.DeadObjectException"这行是什么意思?这两种异常类型没有祖先后代关系
[b] 我在Android论坛上发布了帖子,但他们将我的帖子拒绝为“错误的论坛”,而且没有GMS论坛,所以我完全没有运气。
总之,问题是:GMS触发了这种奇怪的无法捕获的异常,那么这是怎么回事,我该怎么做?
Here's a stack trace:
com.myapp.android.service.AsyncExecutionException
at com.myapp.android.service.AsyncService$ExceptionThrower.run(MyApp:120)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4794)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
at dalvik.system.NativeStart.main(NativeStart.java)
Caused by: java.lang.IllegalStateException: android.os.DeadObjectException
at com.google.android.gms.internal.ey.getLastLocation()
at com.google.android.gms.internal.ez.getLastLocation()
at com.google.android.gms.location.LocationClient.getLastLocation()
***at com.myapp.GoogleLocationProvider.getLastLocation(MyApp:92)***
at com.myapp.LocationProducer.getLocation(MyApp:183)
at com.myapp.LocationProducer.getLocationHeader(MyApp:194)
at com.myapp.API.onExecute(MyApp:344)
...
at java.lang.Thread.run(Thread.java:856)
Caused by: android.os.DeadObjectException
at android.os.BinderProxy.transact(Binder.java)
at com.google.android.gms.internal.ex$a$a.a()
at com.google.android.gms.internal.ey.getLastLocation()
at com.google.android.gms.internal.ez.getLastLocation()
***at com.google.android.gms.location.LocationClient.getLastLocation()***
at com.myapp.GoogleLocationProvider.getLastLocation(MyApp:92)
at com.myapp.LocationProducer.getLocation(MyApp:183)
at com.myapp.LocationProducer.getLocationHeader(MyApp:194)
...
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
------------ 补充 ------------- 以下是我们实际的代码。您会注意到我们始终在调用getLastLocation()之前检查mLocationClient.isConnected(),因此这不是问题所在。可能我们非常不幸地在调用isOnConnected()和getLastLocation()之间期间丢失了mLocationObject,但我觉得这似乎是不太可能的。我想我可以开始记录调用之前、之间和之后的日志并找出原因。
LocationClient mLocationClient; // populated somewhere
public Location getLastLocation() {
if (!mLocationClient.isConnected()) {
return null;
}
Location location = null;
try {
location = mLocationClient.getLastLocation();
} catch (Exception e) {
if (!handleDeadObjectException(e)) {
throw e;
}
}
return location;
}
// logs, attempts to handle depending on user configuration
private boolean handleDeadObjectException(Exception e);