在android中基于计时器的事件(线程)和onLocationChange之间共享数据

时间:2012-07-31 10:56:20

标签: android multithreading interface locationlistener

Scenario- 我有一个基于计时器的事件线程,我通过邮件请求发送数据(经度和纬度)。我有一个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();

}

2 个答案:

答案 0 :(得分:0)

Handlers是一种在线程之间进行通信的方法,认为你可以使用它:)

答案 1 :(得分: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);
    }
}