我正在尝试实现一种只在必要时触发地图覆盖数据请求(来自外部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,因此在执行请求之前逐步退出方法体。 我基本上想绕过线程的任何msg队列并让它立即停止执行,虽然我不确定这是否可行。我在这里吗?我的代码如下所示:
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
答案 0 :(得分:0)
也许您应该考虑在Handler中使用postDelayed
方法而不是调用wait。所以你想要创建一个可以发出请求的Runnable然后在runOnUp中你会做类似的事情。 myHandler.postDelayed(onUpRunnable, 1000)
如果是时候取消该请求,您只需致电myHandler.removeCallbacks(onUpRunnable)
我希望这会有所帮助!
编辑:注意这只会在运行尚未启动时停止运行。如果它已经启动它将没有任何效果。