致命异常:java.lang.IllegalStateException GoogleApiClient尚未连接异常、java、lang、IllegalStateException

由网友(束心经ヽ)分享简介:我们有这个崩溃crashlytics,奇怪的是它发生在 onConnected()回调请求位置更新时。We have this crash in crashlytics, the weird thing is it happens in onConnected() callback when requesting l...

我们有这个崩溃crashlytics,奇怪的是它发生在 onConnected()回调请求位置更新时。

We have this crash in crashlytics, the weird thing is it happens in onConnected() callback when requesting location updates.

code:

abstract public class MainService_6_LocationClient extends MainService_5_DriverGpsLocationStoring
    implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {


  private LocationListener highAccuracyListener;
  private GoogleApiClient googleApiClient;
  private LocationRequest gpsRequest;

  @Override
  public void onCreate() {
    super.onCreate();
    lazyInit();
    googleApiClient.connect();
  }

  @Override public void onConnected(Bundle bundle) {
    Log.d(TAG, "onConnected");
    lazyInit();
    LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, gpsRequest,
          highAccuracyListener);
  }

  private void lazyInit() {

    if (highAccuracyListener == null) {
      highAccuracyListener = new HighAccuracyLocationListener();
    }

    if (googleApiClient == null) {
      googleApiClient = new GoogleApiClient.Builder(this).addApi(LocationServices.API)
          .addConnectionCallbacks(this)
          .addOnConnectionFailedListener(this)
          .build();
    }

    if (gpsRequest == null) {
      gpsRequest = new LocationRequest().setInterval(2000)
          .setFastestInterval(1000)
          .setSmallestDisplacement(0)
          .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    }
  }

  @Override public void onConnectionSuspended(int i) {
    Log.w(TAG, "onConnectionSuspended");
    lazyInit();
    googleApiClient.reconnect();
  }

  @Override public void onConnectionFailed(ConnectionResult connectionResult) {
    Log.e(TAG, "onConnectionFailed");
  }

  @Override public void onDestroy() {
    Log.d(TAG, "onDestroy");

    if (googleApiClient != null) {
      if (googleApiClient.isConnected()) {
        LocationServices.FusedLocationApi.removeLocationUpdates(googleApiClient,
            highAccuracyListener);
        googleApiClient.disconnect();
      }

      googleApiClient = null;
    }
    highAccuracyListener = null;
    gpsRequest = null;

    super.onDestroy();
  }

崩溃日志:

java.lang.IllegalStateException: GoogleApiClient is not connected yet.
       at com.google.android.gms.common.internal.o.a()
       at com.google.android.gms.common.api.b.b()
       at com.google.android.gms.internal.lu.requestLocationUpdates()
       at ee.mtakso.driver.service.orderState.MainService_6_LocationClient.onConnected(MainService_6_LocationClient.java:33)
       at com.google.android.gms.common.internal.f.d()
       at com.google.android.gms.common.api.b.gm()
       at com.google.android.gms.common.api.b.d()
       at com.google.android.gms.common.api.b$2.onConnected()
       at com.google.android.gms.common.internal.f.d()
       at com.google.android.gms.common.internal.f.dL()
       at com.google.android.gms.common.internal.e$h.b()
       at com.google.android.gms.common.internal.e$h.g()
       at com.google.android.gms.common.internal.e$b.gU()
       at com.google.android.gms.common.internal.e$a.handleMessage()
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:137)
       at android.app.ActivityThread.main(ActivityThread.java:4947)
       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:1038)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
       at dalvik.system.NativeStart.main(NativeStart.java)

onConnected()暗示的 GoogleApiClient 连接,并随时可以使用?我怎样才能解决这个问题?

Doesn't onConnected() imply GoogleApiClient is connected and ready to be used? How can I resolve this?

推荐答案

https://developer.android.com/reference/com/google/android/gms/common/api/GoogleApiClient.html

您应该在活动的onCreate(Bundle)来实例化一个客户端对象,然后调用connect()的调用onStart()和断开的onStop()(),无论状态如何。

You should instantiate a client object in your Activity's onCreate(Bundle) method and then call connect() in onStart() and disconnect() in onStop(), regardless of the state.

在GoogleApiClient的实施似乎专为只有一个实例。这是最好的实例只在一次的onCreate,然后执行使用单个实例连接和断开。

The implementation of the GoogleApiClient appears designed for only a single instance. It's best to instantiate it only once in onCreate, then perform connections and disconnections using the single instance.

阅读全文

相关推荐

最新文章