2013-10-15 22 views
6

Ho provato a riconnetterti a LocationClient quando la connessione si interrompe (quando l'utente cancella la RAM).Riconnessione automatica LocationClient a `onDisconnect`

ho provato ad usare questo codice:

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) { 
      ... 
    } 
}; 

ma ho NullPointerException all'interno 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) 

Come posso ripararlo e riconnetterlo?

risposta

3

Ho trovato la soluzione! Basta usare 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 
     } 
    } 
} 
+0

Hai inserito questo codice su onDisconnect(), giusto? – NumberFour

+0

So che questo è vecchio, ma è davvero necessario o anche una buona idea? Dalla [documentazione per onDisconnected()] (https://developers.google.com/games/services/android/api/com/google/android/gms/common/GooglePlayServicesClient.ConnectionCallbacks.html#onDisconnected()) si trova 'chiamato quando il client è disconnesso. Le applicazioni dovrebbero disabilitare le componenti dell'interfaccia utente che richiedono il servizio e attendere una chiamata a onConnected (Bundle) per riattivarle. ' Mi sembra che ricreare manualmente il 'LocationClient' in' onDisconnected() 'non sia richiesto. – zelanix

+0

È necessario perché è necessario chiamare manualmente per connettersi. – nrofis

0

Nella documentazione ufficiale (http://developer.android.com/reference/com/google/android/gms/location/LocationClient.html), è scritto che:

public void disconnect() 

"chiude la connessione ai servizi di Google Play Nessun chiamate possono essere effettuate su questo oggetto dopo aver chiamato questo metodo.".

Così non si può chiamare un connect() subito dopo, si deve ricreare l'oggetto LocationClient come avete fatto per la prima volta al fine di collegare di nuovo.

+0

Ancora quando creo una nuova istanza di LocationClient, viene generata questa eccezione. – nrofis

+0

Per favore pubblica il tuo codice. – fasteque

+0

Ho modificato il mio codice. – nrofis

4

una soluzione ancora più semplice è quella di non fare nulla nel OnDisconnect.

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

quando necessario utilizzare il client è sufficiente controllare se è collegato

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

Google Play Services sembra riconnettersi piacevolmente con storie fuori.

ho usato questo su 4.0.4 e 4.2.2 con successo.

+0

Ma gli aggiornamenti delle posizioni si interrompono e non voglio lasciarli andare, quindi devo riconnetterlo di nuovo. – nrofis

+0

Basta registrare il listener nel metodo onConnected() e il gioco è fatto. – tbolender