我对Android上的GPS有一个非常奇怪的问题。我有一个使用com.google.android.gms.location.LocationClient的应用程序,并且每15秒请求一次locationUpdate。它托管在后台服务中,并跟踪用户的位置。几乎所有时间都工作完美,如果手机在没有任何位置提供商可用的地方(GPS,Wi-Fi,Cell ..)很长一段时间(例如在地下室,车库.. )。离开那个地方并收到一个新的位置后,整个设备都会阻塞并需要重新启动(取出电池)以继续工作。你有没有看到这种行为,你知道一个解决方法吗?
startService(new Intent(this, GPSService.class));
这是服务:
public class GPSService extends Service implements LocationListener,
ConnectionCallbacks, OnConnectionFailedListener {
private LocationClient locationclient;
private LocationRequest locationrequest;
private void InitGpsService() {
if (locationclient != null && locationclient.isConnected()) {
return;
}
int resp = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
if (resp == ConnectionResult.SUCCESS) {
locationclient = new LocationClient(this, this, this);
locationclient.connect();
Log.d("Messangero", "Location Client Connect");
} else {
Toast.makeText(this, "Google Play Service Error " + resp,
Toast.LENGTH_LONG).show();
}
}
// Binder given to clients
private final IBinder mBinder = new LocalBinder();
public class LocalBinder extends Binder {
GPSService getService() {
// Return this instance of LocalService so clients can call public
// methods
return GPSService.this;
}
}
public IBinder onBind(Intent arg0) {
return mBinder;
}
public void onCreate() {
super.onCreate();
InitGpsService();
};
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
};
public void onDestroy() {
super.onDestroy();
if (locationclient != null && locationclient.isConnected()) {
locationclient.removeLocationUpdates(this);
locationclient.disconnect();
}
}
public void onConnectionFailed(ConnectionResult arg0) {
// TODO Auto-generated method stub
}
public void onConnected(Bundle arg0) {
// TODO Auto-generated method stub
PreferencesUtil.LoadSettings(this);
locationrequest = new LocationRequest();
locationrequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
locationrequest.setInterval(PreferencesUtil.GPSSyncPeriod);
locationclient.requestLocationUpdates(locationrequest, this);
}
public void onDisconnected() {
// TODO Auto-generated method stub
if (locationclient != null && locationclient.isConnected())
locationclient.removeLocationUpdates(this);
}
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
Thread thr = new Thread(new LocationUpdateThread(GPSService.this,
location));
thr.start();
}
}
答案 0 :(得分:0)
主线程中的服务RUNS !!!!这就是为什么它会冻结UI。
警告:服务在其托管进程的主线程中运行 - 该服务不会创建自己的线程,也不会在单独的进程中运行(除非您另行指定)。这意味着,如果您的服务要进行任何CPU密集型工作或阻止操作(例如MP3播放或网络),您应该在服务中创建一个新线程来完成这项工作。通过使用单独的线程,您将降低应用程序无响应(ANR)错误的风险,并且应用程序的主线程可以保持专用于用户与您的活动的交互。
http://developer.android.com/guide/components/services.html
例如,您应该通过IntentService来执行此操作。或者在该服务上添加处理程序/线程。