Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GMS::LocationClient(Android)中的DeadObjectException_Android_Location Client - Fatal编程技术网

GMS::LocationClient(Android)中的DeadObjectException

GMS::LocationClient(Android)中的DeadObjectException,android,location-client,Android,Location Client,在Android上,我们有一个类包装了来自GMS(谷歌移动服务)的LocationClient对象。(注意LocationClient实现com.google.android.gms.common.GooglePlayServicesClient) 不幸的是,LocationClient对象有抛出DeadObjectException的习惯(例如,当我们调用LocationClient.getLastLocation()时),我们通过几种日志机制检测到这种情况。然而,奇怪的是LocationCl

在Android上,我们有一个类包装了来自GMS(谷歌移动服务)的LocationClient对象。(注意LocationClient实现com.google.android.gms.common.GooglePlayServicesClient)

不幸的是,LocationClient对象有抛出DeadObjectException的习惯(例如,当我们调用LocationClient.getLastLocation()时),我们通过几种日志机制检测到这种情况。然而,奇怪的是LocationClient并没有被记录为抛出DeadObjectExceptions,而且我只能捕捉到这些DeadObjectExceptions发生时间的1/40。对于这个问题,我们没有任何建议,我个人也从未见过,但是我们的大量用户都会遇到这种情况

其他说明:

[a] “由:java.lang.IllegalStateException:android.os.DeadObjectException引起”一行是关于什么的?这两种异常类型没有祖先-后代关系

[b] 我在安卓论坛上发了帖子,但他们当然以“错误论坛”为由拒绝了我的帖子,而且没有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)
------------附录------------- 这是我们的实际代码。您会注意到,我们总是事先检查mLocationClient.isConnected(),所以这不是问题所在。有可能我们变得非常不走运,mLocationObject在调用IsonConnect()和getLastLocation()之间死亡,但这在我看来是不可能的。我想我可以在通话前、通话中、通话后开始记录,并找出答案

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);
从文件中:

您正在调用的对象已死亡,因为其宿主进程已不存在

也就是说,您正试图在一个不同的过程中到达一个不再可用的对象。例如,如果您绑定到在不同进程(即Google Mobile Services)中运行的服务,则您使用的是“表示”远程进程中对象的本地对象。当远程对象不再可用,并且您尝试使用本地IBinder对象时,您将获得DeadObjectException

所以

a] “由:java.lang.IllegalStateException:android.os.DeadObjectException引起”一行是关于什么的?这两种异常类型没有祖先-后代关系

这两个例外没有任何联系。IllegalStateException是实际异常,DeadObjectException是根异常

由于gms.location.LocationClient.getLastLocation()不想声明公开内部实现的抛出元素(使用绑定等),所以它根本不想声明。但当发生异常(如DeadObjectException时,它仍然希望抛出,因此它使用运行时异常IllegalStateException(不需要抛出声明)

[b] 我在安卓论坛上发了帖子,但他们当然以“错误论坛”为由拒绝了我的帖子,而且没有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)
使用GMS LocationClient时,在与客户端交互之前,需要检查是否LocationClient.isConnected()。请注意,有时LocationClient.isConnected()将返回true,但在调用LocationClient.getLastLocation()之后返回true可能仍会抛出java.lang.IllegalStateException:android.os.DeadObjectException,原因是线程问题和竞争条件,当您检查时客户端已连接,但在实际操作之前连接丢失

您应该做的是a)检查客户端是否已连接

if ( mLocationClient != null && mLocationClient.isConnected() ) {   
    mLocationClient.getLastLocation();
}
b) 捕获非法状态异常(而不是死亡对象异常


我的评论是对原文章的补充(在这里写起来占用了太多的空间)。还要注意handleDeadObjectException(异常e)处理所有类型的异常,其中始终有明确的逻辑来记录和小心处理IllegalStateException和DeadObjectException,因此这应该解决您的问题(b)。我们开始认为我们需要以合理的剪辑创建/销毁LocationClient对象——不要让它们活得太久,也不要在用户在活动之间来回切换时太快地删除它们。切换到绑定服务可能有助于我们做到这一点。首先,捕获异常是您在任何情况下都应该能够做到的事情。因此,不应该有任何问题的实际崩溃,因为这一点。第二,您是否创建多个位置客户端?也许你可以试着只管理一个LocationClient…好吧,我不能抓住例外,这完全是超现实的。不,我们创建了一个LocationClient作为一个单体,并让它永远保持活力,但我认为GMS应该以某种方式让它/某些东西在内部得到回收,因此DOE。这种想法正在转变为这样一种情况:我们在任何给定的时间都只创建一个单一位置的客户端,但我们确保偶尔断开它。对我来说,这听起来不像是一个防弹的解决方案——它可能会减少问题,但不会解决问题。定义一个位置客户机并找出问题所在,例外情况是我将从哪里开始。如果没有看到实际的代码,我很难找出问题所在。应该有效。顺便说一句,我们和一些谷歌销售代表谈过,这可能是由谷歌PlayServices内部的种族状况造成的。那么你知道了,你是如何处理这个问题的吗?嗨,我也遇到了同样的问题。你查清楚了吗solution@MrMike不。我离开了那家公司,在另一家公司短暂地看到了这一点,但到2015年年中,这一问题对我们来说显然已经消失了。