【问题标题】:LocationClient auto reconnect at `onDisconnect`LocationClient 在 `onDisconnect` 处自动重新连接
【发布时间】:2013-10-22 19:54:25
【问题描述】:

我尝试在连接丢失时重新连接到 LocationClient(当用户清除 RAM 时)。

我尝试使用此代码:

private final GooglePlayServicesClient.ConnectionCallbacks mConnectionCallback = new GooglePlayServicesClient.ConnectionCallbacks() {

    @Override
    public void onDisconnected() {
        mLocationClient.removeLocationUpdates(mLocationListener);
        mLocationClient.disconnect();
        mLocationClient= null;

        mLocationClient= new LocationClient(mContext, mConnectionCallback, mConnectionFailedCallback);
        mLocationClient.connect(); // NULL POINTER EXCEPTION
    }

    @Override
    public void onConnected(Bundle bundle) {
          ...
    }
};

但我在 mLocaitonClient.connect() 中得到 NullPointerException。

10-15 08:33:26.478: E/AndroidRuntime(19572): FATAL EXCEPTION: main
10-15 08:33:26.478: E/AndroidRuntime(19572): java.lang.NullPointerException
10-15 08:33:26.478: E/AndroidRuntime(19572):    at com.google.android.gms.internal.bh.a(Unknown Source)
10-15 08:33:26.478: E/AndroidRuntime(19572):    at com.google.android.gms.internal.k.f(Unknown Source)
10-15 08:33:26.478: E/AndroidRuntime(19572):    at com.google.android.gms.internal.k$e.onServiceConnected(Unknown Source)
10-15 08:33:26.478: E/AndroidRuntime(19572):    at com.google.android.gms.internal.l.a(Unknown Source)
10-15 08:33:26.478: E/AndroidRuntime(19572):    at com.google.android.gms.internal.k.connect(Unknown Source)
10-15 08:33:26.478: E/AndroidRuntime(19572):    at com.google.android.gms.location.LocationClient.connect(Unknown Source)
10-15 08:33:26.478: E/AndroidRuntime(19572):    at com.myapp.MyLocationClient$1.onDisconnected(MyLocationClient.java:92)
10-15 08:33:26.478: E/AndroidRuntime(19572):    at com.google.android.gms.internal.k.A(Unknown Source)
10-15 08:33:26.478: E/AndroidRuntime(19572):    at com.google.android.gms.internal.k$e.onServiceDisconnected(Unknown Source)
10-15 08:33:26.478: E/AndroidRuntime(19572):    at com.google.android.gms.internal.l$a$a.onServiceDisconnected(Unknown Source)
10-15 08:33:26.478: E/AndroidRuntime(19572):    at android.app.LoadedApk$ServiceDispatcher.doDeath(LoadedApk.java:1102)
10-15 08:33:26.478: E/AndroidRuntime(19572):    at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1116)
10-15 08:33:26.478: E/AndroidRuntime(19572):    at android.os.Handler.handleCallback(Handler.java:615)
10-15 08:33:26.478: E/AndroidRuntime(19572):    at android.os.Handler.dispatchMessage(Handler.java:92)
10-15 08:33:26.478: E/AndroidRuntime(19572):    at android.os.Looper.loop(Looper.java:137)
10-15 08:33:26.478: E/AndroidRuntime(19572):    at android.app.ActivityThread.main(ActivityThread.java:4898)
10-15 08:33:26.478: E/AndroidRuntime(19572):    at java.lang.reflect.Method.invokeNative(Native Method)
10-15 08:33:26.478: E/AndroidRuntime(19572):    at java.lang.reflect.Method.invoke(Method.java:511)
10-15 08:33:26.478: E/AndroidRuntime(19572):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
10-15 08:33:26.478: E/AndroidRuntime(19572):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
10-15 08:33:26.478: E/AndroidRuntime(19572):    at dalvik.system.NativeStart.main(Native Method)

如何修复并重新连接?

【问题讨论】:

    标签: android reconnect location-client


    【解决方案1】:

    一个更简单的解决方案是在OnDisconnect 中什么都不做。

    public void onDisconnect(){
         //do nothing to client
    }
    

    当需要使用客户端时,只需检查是否已连接

    if(mLocationClient.isconnected()){
         mLocationClient.connect();
    }
    

    Google Play 服务似乎可以很好地重新连接。

    我已经在 4.0.4 和 4.2.2 上成功使用过这个。

    【讨论】:

    • 但是位置更新停止了,我不想让它发生,所以我必须重新连接它。
    • 只需在 onConnected() 方法中注册监听即可。
    【解决方案2】:

    我找到了解决方案!只需使用Handler

    @Override
    public void onDisconnected() {
    
        new Handler().post(new Runnable() {
            @Override
            public void run() {
                mLocationClient.removeLocationUpdates(mLocationListener);
                mLocationClient.disconnect();
                mLocationClient = null;
    
                mLocationClient = new LocationClient(mContext, mConnectionCallback, mConnectionFailedCallback);
                mLocationClient.connect(); // NOW WORKING
            }
        }
    }
    

    【讨论】:

    • 我知道这是旧的,但这真的是必需的,甚至是一个好主意吗?从documentation for onDisconnected() 中,它是在客户端断开连接时调用的。应用程序应禁用需要该服务的 UI 组件,并等待调用 onConnected(Bundle) 以重新启用它们。在我看来,不需要在onDisconnected() 中手动重新创建LocationClient
    【解决方案3】:

    在官方文档(http://developer.android.com/reference/com/google/android/gms/location/LocationClient.html)中是这样写的:

    public void disconnect ()
    

    “关闭与 Google Play 服务的连接。调用此方法后,无法对该对象进行任何调用。”

    所以你不能在之后调用connect(),你必须像第一次那样重新创建LocationClient对象才能再次连接。

    【讨论】:

    • 当我创建 LocationClient 的新实例时,仍然抛出此异常。
    • 您是否尝试在不断开定位客户端的情况下调用 onDisconnected() 中的 connect()?
    • 我检查了谷歌示例,在断开连接时,他们什么也不做,或者只是将客户端设置为空。当您尝试我的第一个解决方案时,您是否遇到了同样的异常?
    • 是的,它没有任何改变
    • @fasteque api 文档是真的。但问题是没有调用disconnect(),而是playservices调用了onDisconnect()。所以你不需要重新创建 LC。
    猜你喜欢
    • 2021-02-25
    • 1970-01-01
    • 2022-01-22
    • 2019-03-15
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 2015-03-12
    相关资源
    最近更新 更多