通过直接中断暂停工作线程中的方法

时间:2011-05-08 18:58:31

标签: android multithreading google-maps rest

我正在尝试实现一种只在必要时触发地图覆盖数据请求(来自外部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

1 个答案:

答案 0 :(得分:0)

也许您应该考虑在Handler中使用postDelayed方法而不是调用wait。所以你想要创建一个可以发出请求的Runnable然后在runOnUp中你会做类似的事情。 myHandler.postDelayed(onUpRunnable, 1000)如果是时候取消该请求,您只需致电myHandler.removeCallbacks(onUpRunnable)我希望这会有所帮助!

编辑:注意这只会在运行尚未启动时停止运行。如果它已经启动它将没有任何效果。