2

私は、デモ アプリケーションの位置情報サービスに取り組んできました。私はネットワークと 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)
4

1 に答える 1

1

使用する必要があります

class GpsTimer extends TimerTask {

    @Override
    public void run() {

        Looper.prepare();
        Log.d("", "running");

        mLocationM.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
                2 * 60 * 1000, 0, mNetworkListener);

        Looper.loop();

    }

}

使用してはいけない理由handler

Handler h = new Handler();

Runnable run = new Runnable() {

    @Override
    public void run() {
        Log.d("", "running");

        mLocationM.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
                2 * 60 * 1000, 0, mNetworkListener);

        h.postDelayed(this, 5000); // 5 seconds
    }
};

@Override
protected void onDestroy() {
    h.removeCallbacks(run);
};

それは次のように機能しますTimerTask

    h.post(run);
于 2013-03-17T16:57:25.687 に答える