私が取り組むAndroidアプリケーションでは、15分ごとにGPSの場所を記録する必要があります。 GPSの使用状況を最小限に抑えてバッテリ寿命を延ばすには、ScheduledExecutorServiceを使用して位置の更新を要求し、位置の変更が発生したら要求をオフにします。私の現在の実装では、エラーが発生したため、これを許可しない:私はLocationManagerは、バックグラウンドスレッドで呼び出しを行うことができないので、私は知っているスケジュールされたスレッドでの位置更新をリクエストする
Can't create handler inside thread that has not called Looper.prepare()
が発生しました。
私のコードは、スケジューラを起動します。
locationFinder = new LocationFinder(context);
final Runnable gpsBeeper = new Runnable()
{
public void run()
{
try {
locationFinder.getLocation();;
}
catch (Exception e)
{
Log.e(TAG,"error in executing: It will no longer be run!: " + e.getMessage());
e.printStackTrace();
}
}
};
gpsHandle = scheduler.scheduleAtFixedRate(gpsBeeper, 0, 15, MINUTES);
LocationFinderクラス:
public LocationFinder(Context context)
{
this.mContext = context;
}
public void getLocation()
{
locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);
isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
if (isGPSEnabled)
{
try
{
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, updateInterval, distance, this);
}
catch (SecurityException s)
{
s.printStackTrace();
}
}
}
public void stopUpdates(){
locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);
locationManager.removeUpdates(this);
}
@Override
public void onLocationChanged(Location location)
{
latitude = location.getLatitude();
longitude = location.getLongitude();
isGPSUpdated = true;
stopUpdates();
}
がどのように私はメインスレッドでrequestLocationUpdatesを呼び出すに頼ることなくこれを行うことができますか?