2011-05-08 48 views
1

停止在辅助线程的方法,我想实现的方式来触发地图覆盖数据的请求(来自外部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

回答

0

也许你应该考虑使用postDelayed方法在处理程序,而不是调用wait。所以你会想创建一个Runnable,它会发出你的请求,然后在runOnUp中你会做类似的事情。 myHandler.postDelayed(onUpRunnable, 1000)如果接下来要取消该请求,您只需拨打myHandler.removeCallbacks(onUpRunnable)我希望这有助于您!

编辑:请注意,这只会从如果尚未开始启动停止运行的。如果它已经启动,它将不起作用。

+0

感谢队友,这似乎是一个非常干净的方式来做到这一点,正是我之后。我实际上设法通过调用中断来实现它。尽管如此,我会尽力去做。再次感谢 – manno23 2011-05-09 10:31:28