私は、デモ アプリケーションの位置情報サービスに取り組んできました。私はネットワークと GPS のリスナーを設定しています (これは 1 つで実行できることはわかっていますが、非常に基本的な Java を使用しているため、これを使用する方が簡単です)。とにかく、GPS の更新に登録して、問題が解決したらタイマーを開始したいのですが、タイマーを再起動して聞き続けたいと思っています。ただし、タイマーが切れたら、ネットワークの更新に登録したいと思います。
これまでの問題は、タイマーが経過し、mLocationM.request を使用して timerTask の run() でネットワーク更新に登録しようとしたときです ....例外が発生します。
これはスレッドの問題であると考えており、ハンドラーが重くなるのを避けるための最も基本的な方法を探しています。
class GpsTimer extends TimerTask{
@Override
public void run() {
Log.d(TAG, "running");
mLocationM.requestLocationUpdates
(LocationManager.NETWORK_PROVIDER, 2 * 60 * 1000, 0, mNetworkListener);
}
}
それが問題の原因となっている行だと思います
03-17 16:33:38.528: E/AndroidRuntime(29913): FATAL EXCEPTION: Thread-1364
03-17 16:33:38.528: E/AndroidRuntime(29913): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
03-17 16:33:38.528: E/AndroidRuntime(29913): at android.os.Handler.<init>(Handler.java:121)
03-17 16:33:38.528: E/AndroidRuntime(29913): at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:183)
03-17 16:33:38.528: E/AndroidRuntime(29913): at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:183)
03-17 16:33:38.528: E/AndroidRuntime(29913): at android.location.LocationManager._requestLocationUpdates(LocationManager.java:661)
03-17 16:33:38.528: E/AndroidRuntime(29913): at android.location.LocationManager.requestLocationUpdates(LocationManager.java:486)
03-17 16:33:38.528: E/AndroidRuntime(29913): at com.sblyit.finder.LocationService$GpsTimer$1.run(LocationService.java:150)
03-17 16:33:38.528: E/AndroidRuntime(29913): at java.lang.Thread.run(Thread.java:856)