I tried to reconnect to LocationClient when the connection gets lost (When user clear the RAM).
I tried to use this code:
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) {
...
}
};
But I get NullPointerException inside mLocaitonClient.connect()
.
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)
How can I fix it and reconnect?
I found the solution! Just use
Handler
.In the official documentation (http://developer.android.com/reference/com/google/android/gms/location/LocationClient.html), it's written that:
"Closes the connection to Google Play services. No calls can be made on this object after calling this method."
So you cannot call a
connect()
just after, you have to recreate theLocationClient
object like you did the first time in order to connect again.an even simpler solution is to do nothing in the
OnDisconnect
.when need to use the client simply check if is connected
the Google Play Services seems to reconnect nicely with out fuss.
i have used this on 4.0.4 and 4.2.2 successfully.