title: GoogleApiClient must not be null [Awareness API]
body: <p>I'm trying to find out why the Google Play Services is crashing with a nullpointerexception after the application is coming back from a background state such as device sleep or toggle other program. Sometimes Google Play Services gives the crash popup on application start. So I assume the problem lies somewhere on the path to the service since there is where the threading occurs with rxjava.</p>
  
  <pre><code>Note: I Inject GoogleApiClient in both MainActivity (field injection) and in GoogleApiService (constructor injection). 
  </code></pre>
  
  <p>GoogleApiClient is injected as a @Singleton. I've been trying to trace why this is happening for hours now without progress, any help appreciated.</p>
  
  <p><strong>The Application continues to work without any issues, the "Google Play Services popup" is annoying though</strong>, I see one call to getuserLocAndWeather() return lost connection to google play services, but it immediatly returns a valid result in the next call.</p>
  
  <p>The actual object reference in MainActivity and GoogleApiService is never null, the reference is always the same, like com.google.android.gms.internal.zzqd@a768e13 and always connected when the call is made.</p>
  
  <p>Trace:</p>
  
  <pre><code>FATAL EXCEPTION: lowpool[3]
  Process: com.google.android.gms.persistent, PID: 12828
  java.lang.NullPointerException: GoogleApiClient must not be null
       at ilk.a(:com.google.android.gms:73)
       at hys.&lt;init&gt;(:com.google.android.gms:115)
       at pof.&lt;init&gt;(:com.google.android.gms:86)
       at ppz.&lt;init&gt;(:com.google.android.gms:35)
       at ppx.&lt;init&gt;(:com.google.android.gms:179)
       at ppp.a(:com.google.android.gms:179)
       at buc.a(:com.google.android.gms:381)
       at jfo.run(:com.google.android.gms:1087)
       at itt.run(:com.google.android.gms:453)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
       at iyg.run(:com.google.android.gms:17)
       at java.lang.Thread.run(Thread.java:818)
  </code></pre>
  
  <p>My Service class:, the print out in the try{} for the client is always : true, regardless if google play services crashes or not.</p>
  
  <p>Client: com.google.android.gms.internal.zzqd@3c738f4e Connected? :true</p>
  
  <pre><code>public class GoogleApiService  implements IGoogleApi{
  private GoogleApiClient client;
  private static final String TAG = "GoogleApiClient";
  
  @Inject
  public GoogleApiService(GoogleApiClient client){
      this.client = client;
  
  }
  
  
  public Observable&lt;UserCurrentInfo&gt; getLocationWeather(){
      Observable&lt;WeatherResult&gt; weatherObservable = Observable.create(subscriber -&gt; {
  
          try {
              Log.d(TAG,"Trying to get some Weather");
              Log.d(TAG,"Client: " + client.toString() + " Connected? :" + client.isConnected());
  
  
              Awareness.SnapshotApi.getWeather(client)
                      .setResultCallback(weather -&gt; {
                          if (!weather.getStatus().isSuccess()) {
                              subscriber.onError(new Throwable("could not get weather"));
                              Log.d(TAG," Error getting weather" + weather.getStatus().toString());
  
                          } else {
                              Log.d(TAG,"Getting dem weathers");
                              subscriber.onNext(weather);
                              subscriber.onCompleted();
                          }
                      });
          }catch (SecurityException e){
              throw new SecurityException("No permission: " + e);
  
          }
      });
  
  
  
      Observable&lt;LocationResult&gt; locationObservable = Observable.create(subscriber -&gt; {
          try {
              Awareness.SnapshotApi.getLocation(client)
                      .setResultCallback(retrievedLocation -&gt; {
                          if (!retrievedLocation.getStatus().isSuccess()) {
                              subscriber.onError(new Throwable("Could not get location."));
                              Log.d(TAG," Error getting location");
  
                          } else {
                              subscriber.onNext(retrievedLocation);
                              subscriber.onCompleted();
                          }
                      });
          }catch (SecurityException e){
              throw new SecurityException("No permission: " + e);
  
          }
      });
  
      return Observable.zip(weatherObservable, locationObservable,
              (weather, location) -&gt; {
                  return new UserCurrentInfo(weather.getWeather(),location.getLocation());
              });
  }
  </code></pre>
  
  <p>Presenter:</p>
  
  <pre><code>public class FavouritesPresenter implements BasePresenter&lt;IFavouriteView&gt;{
  
  private IFavouriteView favView;
  private String TAG = "FavPresenter";
  private Subscription subscription;
  private GetUserLocationWeatherUseCase useCase;
  
  @Inject
  FavouritesPresenter(GetUserLocationWeatherUseCase wlUseCase){
      this.useCase = wlUseCase;
  }
  @Override
  public void onCreate() {
  }
  
  @Override
  public void onStop(){
      if(subscription != null){
          subscription.unsubscribe();
      }
  }
  public void getUserLocAndWeather(){
      subscription = useCase.execute().subscribeOn(Schedulers.io())
              .observeOn(AndroidSchedulers.mainThread())
              .subscribe(info -&gt; {
                          favView.showText(
                                  formatStringDecimals(info.getWeather().getTemperature(Weather.CELSIUS)+"",2),
                                  info.getWeather().getConditions()[0],
                                  formatStringDecimals(""+info.getLocation().getLatitude(),3),
                                  formatStringDecimals("" + info.getLocation().getLongitude(),3)
  
                          );},
                      err -&gt;{favView.showText("??",0,"","");}
              );
  }
  </code></pre>
  
  <p>Usecase:</p>
  
  <pre><code>public class GetUserLocationWeatherUseCase implements Usecase&lt;UserCurrentInfo&gt; {
  IGoogleApi apihelper;
  
  public GetUserLocationWeatherUseCase(IGoogleApi helper){
      this.apihelper  = helper;
  }
  @Override
  public Observable&lt;UserCurrentInfo&gt; execute(){
      return apihelper.getLocationWeather();
  
  }
  </code></pre>
  
  <p>Usage in mainactivity:</p>
  
  <pre><code>@Inject
  FavouritesPresenter favouritesPresenter;
  GoogleApiClient.ConnectionCallbacks connectionCallbacks;
  GoogleApiClient.OnConnectionFailedListener connectionFailedListener;
  @Inject
  GoogleApiClient mGoogleApiClient;
  
  
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      ButterKnife.bind(this);
      initInjector();
      favouritesPresenter.attachView(this);
      favouritesPresenter.onCreate();
      registerReceiverGPS();
  }
  
  
  
  @Override
  protected void onStart() {
      super.onStart();
      if (mGoogleApiClient != null){
          registerCallbacks(this.mGoogleApiClient);
          registerFailedToConnect(this.mGoogleApiClient);
          mGoogleApiClient.connect();
      }
  }
  
  @Override
  protected void onStop() {
      favouritesPresenter.onStop();
      if (mGoogleApiClient != null) {
          mGoogleApiClient.unregisterConnectionCallbacks(this.connectionCallbacks);
          mGoogleApiClient.unregisterConnectionFailedListener(this.connectionFailedListener);
          mGoogleApiClient.disconnect();
      }
  }
  
  @Override
  public void registerCallbacks(GoogleApiClient client){
      this.connectionCallbacks = new GoogleApiClient.ConnectionCallbacks() {
          @Override
          public void onConnected(@Nullable Bundle bundle)
              favouritesPresenter.getUserLocAndWeather(); //Call to presenter that initiates the observable chain, actually this              comes later after some GPS checks and such, but for easier cohesion
          }
          @Override
          public void onConnectionSuspended(int i) {}
      };
      client.registerConnectionCallbacks(this.connectionCallbacks);
  }
  </code></pre>