0
私はAndroidのこのルーパーに苦労しています。私は毎分実行されるタイマーを持っています。これにより、ユーザーの所在地とともにサーバーにメッセージが送信されます。Android TimerTaskでGPSの場所がフリーズする
private Looper looper;
public boolean getLocation(Context context, LocationResult result) {
locationResult = result;
lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
//exceptions will be thrown if provider is not permitted.
try {
gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
} catch (Exception ex) {
}
// don't start listeners if no provider is enabled
if (!gps_enabled)
return false;
if(Looper.myLooper() == null)
Looper.myLooper().prepare();
looper = Looper.myLooper();
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps);
looper.loop();
return true;
}
LocationListener locationListenerGps = new LocationListener() {
public void onLocationChanged(Location location) {
looper.quit();
lm.removeUpdates(this);
locationResult.gotLocation(location); // broadcast location
}
public void onProviderDisabled(String provider) {
}
public void onProviderEnabled(String provider) {
}
public void onStatusChanged(String provider, int status, Bundle extras) {
}
};
初めてタイマーが起動すると、すべて正常に動作します。 2回目は、タイマーがフリーズし、携帯電話のGPSアイコンにロックが設定されていると表示されますが、離れません。ルーパーが2回目にメッセージを処理するためにループしていないかのようです。毎回Looper.prepare()を呼び出すと、2回目にタイマーが実行されますが、スレッドごとに1つのLooperしか例外が発生しません。
確かにこれはあまり難しくありません!