サービスで Timer と TimerTask を使用しており、このメソッド @ Service - onCreate() を使用して GPS を定期的にチェックするようにスケジュールしています。
scheduleAllGPST.scheduleAtFixedRate(new AllGPSTimer(), 0,
everyInterval);
私のサービスクラスからのコードスニペット:
//class inside service class
class AllGPSTimer extends TimerTask {
public void run() {
if (!canGetLocation) stopLocationRequest();
else requestLocation();
}
}
// Service class method
public void requestLocation() {
try {
locListener = new mylocationlistener();
locationManager.requestLocationUpdates(provider, 0, 0, locListener);// Error happens at this line
}
catch (Exception e) {
e.printStackTrace();
}
}
public void stopLocationRequest() {
try {
locationManager.removeUpdates(locListener);// And also it happens at this line
}
catch (Exception e) {
e.printStackTrace();
}
}
このエラーが発生しています:
Error :
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
at android.os.Handler.<init>(Handler.java:121)
at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:139)
at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:137)
at android.location.LocationManager._requestLocationUpdates(LocationManager.java:708)
at android.location.LocationManager.requestLocationUpdates(LocationManager.java:630)
at com.mobile.sales.GPSService.requestLocation(GPSService.java:146)
at com.mobile.sales.GPSService$AllGPSTimer.run(GPSService.java:140)
at java.util.Timer$TimerImpl.run(Timer.java:289)
エラーから、この requestLocationUpdates() と removeUpdates() は、メイン スレッドの生成されたスレッドからではなく、サービス クラスのメイン スレッドからのみ使用できると推測しています。私はそれを正しく推測していますか?
Service クラスの Activity クラスに runOnUiThread(runnable) のようなメソッドはありますか?
ロケーションAPIメソッドとタイマータスクの生成されたスレッドを処理する必要がありますか? また、私が間違っていると推測している場合はお知らせください。
ありがとうございました!