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();
}
答案 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);
}
}