停止在辅助线程的方法,我想实现的方式来触发地图覆盖数据的请求(来自外部Web服务器),只有当它似乎有必要。通过直接中断
要做到这一点我在想有屏幕触摸事件外螺纹触发一个计数器,如果用户将鼠标悬停在地图区域而不触及约一秒的请求画面被发送。
事件流会是这个样子:
UI Thread -down press-----release-----down---release---------------------->
v v v
Worker Thread -----------------start------stop----start---------------send---->
timer======timer timer==============request
<1s 1s
我遇到麻烦UIthread停止wait()调用的方法,并抛出一个InterruptionException,因此走出了方法体的前它可以执行请求。 我基本上只想绕过线程的任何消息队列,并立即停止执行,虽然我不确定这是可能的。我在这里跟踪?我的代码如下所示:
public class ExtendedMapView extends MapView {
private final static int DOWN_PRESS = 1;
private final static int RELEASE_PRESS = 2;
private Handler countThreadHandler;
private TouchThread touchMonitor ;
public ExtendedMapView(Context context, AttributeSet attrs) {
super(context, attrs);
touchMonitor = new TouchThread();
touchMonitor.start();
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch(ev.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.d("TEST", "Touch Screen");
touchMonitor.interrupt();
break;
case MotionEvent.ACTION_UP:
Log.d("TEST", "Touch released");
countThreadHandler.sendMessage(Message.obtain(countThreadHandler,RELEASE_PRESS));
break;
default:
break;
}
return super.onTouchEvent(ev);
}
private class TouchThread extends Thread {
@Override
public void interrupt() {
super.interrupt();
Log.d("TEST", "Thread interrupted");
}
@Override
public synchronized void run() {
try {
Looper.prepare();
countThreadHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case DOWN_PRESS:
runOnDown();
break;
case RELEASE_PRESS:
runOnUp();
break;
}
};
Looper.loop();
Log.d("TEST", "thread started");
} catch (Throwable t) {
t.printStackTrace();
Log.d("TEST", "thread not started");
}
}
private synchronized void runOnUp() {
Log.d("TEST", "count started");
downPressed = false;
try {
Log.d("TEST", "Timer started");
wait(1000);
//SEND REST MSG BASED OFF RECIEVED MAP FILL CO-ORDS
Log.d("TEST", "send Rest msg--------------------->");
} catch (InterruptedException e) {
e.printStackTrace();
Log.d("TEST", "Received Interruption NIIICE");
}
}
}
}
我会一直在阅读和尝试的平均时间。谢谢:d
感谢队友,这似乎是一个非常干净的方式来做到这一点,正是我之后。我实际上设法通过调用中断来实现它。尽管如此,我会尽力去做。再次感谢 – manno23 2011-05-09 10:31:28