我想创建我每隔几秒向GCM发送一条消息。但过了一段时间后,我想再次删除locationupdates。为了将数据发送到gcm的intentservice,我使用pendingintent。现在每次都发生了很多我得到这个错误:
引起:
java.lang.IllegalStateException: GoogleApiClient is not connected yet.
at com.google.android.gms.common.internal.n.a(Unknown Source)
at com.google.android.gms.common.api.b.b(Unknown Source)
at com.google.android.gms.internal.lt.removeLocationUpdates(Unknown Source)
at com.example.task_1.Location.LocationUpdate.stopLocationUpdates(LocationUpdate.java:83)
at com.example.task_1.Location.LocationUpdate.onStartCommand(LocationUpdate.java:52)
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2704)
at android.app.ActivityThread.access$1900(ActivityThread.java:141)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1353)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
这是我的代码:
public class LocationUpdate extends Service implements GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener {
private static final String TAG = "DRIVER";
private SharedPreferences pref;
private String driverId;
private GoogleApiClient mGoogleApiClient;
private LocationRequest mLocationRequest;
private Intent mGcmIntentService;
private PendingIntent mPendingIntent;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e(TAG, "onStartCommand");
super.onStartCommand(intent, flags, startId);
boolean stopService = false;
if (intent != null)
stopService = intent.getBooleanExtra("stopservice", false);
if (stopService)
stopLocationUpdates();
return START_STICKY;
}
@Override
public void onCreate() {
Log.e(TAG, "onCreate");
pref = getSharedPreferences("driver_app", MODE_PRIVATE);
driverId = pref.getString("driver_id", "");
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(LocationServices.API).addConnectionCallbacks(this)
.addOnConnectionFailedListener(this).build();
mGoogleApiClient.connect();
}
@Override
public void onDestroy() {
Log.e(TAG, "onDestroy");
super.onDestroy();
}
public void stopLocationUpdates() {
if(!mGoogleApiClient.isConnected()){
mGoogleApiClient.connect();
}
mGcmIntentService = new Intent(this,SendDataIntentService.class);
mGcmIntentService.putExtra("ID", "FusedLocation");
mPendingIntent = PendingIntent.getService(this, 0, mGcmIntentService, PendingIntent.FLAG_CANCEL_CURRENT);
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, mPendingIntent);
if (mGoogleApiClient.isConnected())
mGoogleApiClient.disconnect();
}
@Override
public void onConnectionFailed(ConnectionResult arg0) {
// TODO Auto-generated method stub
}
@Override
public void onConnected(Bundle arg0) {
// TODO Auto-generated method stub
mLocationRequest = LocationRequest.create();
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
mLocationRequest.setInterval(30000);
startLocationUpdates();
}
private void startLocationUpdates() {
mGcmIntentService = new Intent(this,SendDataIntentService.class);
mGcmIntentService.putExtra("ID", "FusedLocation");
mPendingIntent = PendingIntent.getService(this, 0, mGcmIntentService, PendingIntent.FLAG_CANCEL_CURRENT);
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, mPendingIntent);
}
@Override
public void onConnectionSuspended(int arg0) {
// TODO Auto-generated method stub
}
}
任何人都知道如何解决这个错误?或者如何解决?我在网上搜索但找不到任何东西。
答案 0 :(得分:1)
问题在于,在stopLocationUpdates()
方法中,在致电removeLocationUpdates()
之前,您并没有等待连接API。
解决此问题的一种简单方法是在需要删除位置回调时设置布尔标志,但API未连接。
添加成员变量:
private boolean isRemoving = false;
然后修改逻辑,以便在取消注册位置回调之前等待API连接。
在stopLocationUpdates()
方法中:
public void stopLocationUpdates() {
if(!mGoogleApiClient.isConnected()){
isRemoving = true; //added
mGoogleApiClient.connect();
}
else {
mGcmIntentService = new Intent(this, SendDataIntentService.class);
mGcmIntentService.putExtra("ID", "FusedLocation");
mPendingIntent = PendingIntent.getService(this, 0, mGcmIntentService, PendingIntent.FLAG_CANCEL_CURRENT);
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, mPendingIntent);
if (mGoogleApiClient.isConnected())
mGoogleApiClient.disconnect();
}
}
在onConnected()
回调中:
@Override
public void onConnected(Bundle arg0) {
if (isRemoving){
stopLocationUpdates();
}
else {
// TODO Auto-generated method stub
mLocationRequest = LocationRequest.create();
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
mLocationRequest.setInterval(30000);
startLocationUpdates();
}
}
您还希望在startLocationUpdates()
中将标志设置为false:
private void startLocationUpdates() {
isRemoving = false; //added
mGcmIntentService = new Intent(this,SendDataIntentService.class);
mGcmIntentService.putExtra("ID", "FusedLocation");
mPendingIntent = PendingIntent.getService(this, 0, mGcmIntentService, PendingIntent.FLAG_CANCEL_CURRENT);
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, mPendingIntent);
}
同样在onCreate()
:
@Override
public void onCreate() {
Log.e(TAG, "onCreate");
isRemoving = false; //added
pref = getSharedPreferences("driver_app", MODE_PRIVATE);
driverId = pref.getString("driver_id", "");
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(LocationServices.API).addConnectionCallbacks(this)
.addOnConnectionFailedListener(this).build();
mGoogleApiClient.connect();
}
编辑:要在之前取消之后重新启动位置回调,您可以使用onStartCommand()
方法。
修改onStartCommand()
,以便它可以停止和启动位置更新:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e(TAG, "onStartCommand");
super.onStartCommand(intent, flags, startId);
boolean stopService = false;
if (intent != null) {
stopService = intent.getBooleanExtra("stopservice", false);
}
if (stopService) {
stopLocationUpdates();
}
else{
isRemoving = false;
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(LocationServices.API).addConnectionCallbacks(this)
.addOnConnectionFailedListener(this).build();
mGoogleApiClient.connect();
}
return START_STICKY;
}
然后,为了重新启动位置更新,您可以使用startService()
设置为false的Intent调用stopservice
:
Intent i = new Intent(this, LocationUpdate.class);
i.putExtra("stopservice", false);
startService(i);