2

アプリに問題があります。特定の間隔で位置情報の更新を取得する必要があるため、基本的に GPS モジュールを適切に制御できる必要がありますが、これは Android OS では簡単ではありません。基本的に、5 分間隔で 2 分間 GPS をオンにする必要があります。タイミングが遅くなり、場所を 2 回取得できますが、実行時エラーでアプリがクラッシュします。スレッドごとに作成されるルーパーは 1 つだけです。タイミングはサービスクラスで行われ、うまく機能します。更新とすべてが削除され、私が抱えているこの問題だけです。

私はもともとこのエラーを抱えていました - 「Looper.prepare() を呼び出していないスレッド内でハンドラーを作成できません」というエラーを以下のコードで修正しましたが、今ではルーパーエラーが 1 つだけ発生します。

私のルーパースレッドは次のようになります(厳しくしないでください、私はAndroidに非常に慣れていません笑)

            public void run() {
        Looper.prepare();
        setLooper(Looper.myLooper());
        LocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
                0, locationListener);
        Timer t = new Timer();
        t.schedule(new TimerTask() {

            @Override
            public void run() {
                stopLooper();

            }

        }, TWO_MINUTES);
        Looper.loop();
        t.cancel();
        setLooper(null);
        vb.getLm().removeUpdates(ll);

    }

私が言ったように、私は新しいので、ハンドラーの使用方法がわかりません。ここStackOverflowの投稿からこのコードの一部を取得しましたが、別の方法で使用しましたが、機能しません。

本当に助けが必要です。ご回答ありがとうございます。

OK、解決策を見つけたようです。テストしてから、回答を投稿する前にさらに7時間待つ必要があります笑。閲覧と返信ありがとうございます。

4

2 に答える 2

1

あなたのコードが何をしているのか理解できません:)次のような簡単なものを使用しないでください:

public void run( ) {
    while (true) {
        LocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
            0, locationListener);
        sleep(2 * 60 * 1000);
        LocationManager.removeUpdates();
        sleep(5 * 60 * 1000);
    }
}

わかりました、多分そのようなものですか?

Runnable start = new Runnable( ) {
    public void run( ) {
        LocationManager.startLocationUpdates
        handler.postDelayed(stop, 2 * 60 * 1000L);
    }
}

Runnable stop = new Runnable( ) {
    public void run( ) {
        LocationManager.removeLocationUpdates
    }
}

Runnable onePeriod = new Runnable( ) {
    public void run( ) {
        handler.postDelayed(onePeriod, 5 * 60 * 1000);
        handler.post(start);
    }
}

public void startContiniuosListening( ) {
    handler.post(onePerion);
}

public void stopContiniousListening( ) {
    handler.removeCallback(stop);
    handler.removeCallback(onePeriod);
    LocationManager.removeLocationUpdates(...)
}

ここで、handler はクラス フィールドです。

Handler handler = new Handler();
于 2011-12-09T08:00:53.140 に答える
0

同様の質問に対するこの回答が非常に役立つことがわかりました: https://stackoverflow.com/a/6576972/588556

基本的に、質問のコードを独自のスレッドでラップするだけです...

new Thread(new Runnable() {
    // Your code here...
}).start();

次に、このワーカー スレッドが独自の Looper を作成します。

于 2012-12-10T01:33:08.073 に答える