1

シナリオ - ポスト リクエストを通じてデータ (緯度と経度) を送信するタイマー ベースのイベント スレッドがあります。場所の変更時に呼び出される onLocationChange メソッド (私のクラスは LocationListener で実装) があります。後でタイマーイベントによって呼び出される新しい緯度と経度の値を設定します。

タイマー イベントは、場所の変更イベントで最新の緯度と経度の値を取得しません。タイマーイベントが開始すると、場所が変更されてもonlocationchangeメソッドを呼び出しません。

タイマーイベントは次のとおりです。

/** このメソッドは 10 秒ごとにサービスを呼び出します。*/

protected void timerMethod(CookieStore cookieStore, String url) {
    int delay = 1000; // delay for 1 sec.
    int period = 10000; // repeat every 10 sec.
    timer = new Timer();
    if (timer != null) {
        timer.scheduleAtFixedRate(new TimerTask() {
            public void run() {
                timerThread = new Thread() {
                    @Override
                    public void run() {

                        sendpostRequest();  // calling the post method
                    }
                };
                timerThread.start();

            }
        }, delay, period);
    }
}

場所変更イベントは次のとおりです。

/** このメソッドは、場所が変更されたときに呼び出されます。*/

public void onLocationChanged(Location location) {

    isLocationChanged = true;  // setting a boolean value which is checked while posting the request
    System.out.println();
    System.out.println("Location change:::longitude::::" + location.getLongitude() + "latiude::::"
            + location.getLatitude());

    latClient = location.getLatitude();
    longClient = location.getLongitude();

}
4

2 に答える 2

0

問題を完全に理解しているかどうかはわかりませんが、この解決策は非効率的であり、リソースを大量に消費する大量のスレッドを作成します。代わりにこのようなことを試してください。私はこれをすべてこのウィンドウに書き込んでテストしなかったので、必ずテストしてください。ただし、問題の説明を考えると、これは正しい方向にあると思います。ある時点で TimerLooper.terminate() を呼び出すようにしてください。

private void startTimerThread() {
    mTimerLooper = new TimerLooper(new Handler() {
            @Override
            public void handleMessage() {
                onLocationChanged();
            }
        }, "timer-thread");
    mTimerLooper.start();
}

private class TimerLooper extends HandlerThread() {
    private static final int MSG_TERMINATE = 1;
    private static final int MSG_TIMER_EXPIRATION = 2;
    private Handler mCallback;
    private Handler mHandler;

    public TimerLooper(Handler callback, String name) {
        mCallback = callback;
    }

    @Override
    public void onLooperPrepared() {
        mHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case MSG_TERMINATE:
                        mHandler.removeMessages(MSG_TIMER_EXPIRATION);
                        getLooper().quit();
                        break;
                    case MSG_TIMER_EXPIRATION:
                        mCallback.sendEmptyMessage(0);
                        mHandler.sendEmptyMessageDelayed(
                                10000, MSG_TIMER_EXPIRATION);
                        break;
                }
        mHandler.sendEmptyMessageDelayed(10000, MSG_TIMER_EXPIRATION);
        super.onLooperPrepared();
    }

    public void terminate() {
        mHandler.sendEmptyMessage(MSG_TERMINATE);
    }
}
于 2012-07-31T18:30:49.253 に答える
0

ハンドラーはスレッド間で通信する方法です。それを使用できると思います:)

于 2012-07-31T11:04:17.117 に答える