title: Halting a method in a worker thread through a direct interruption
body: <p>I'm trying to implement a way to trigger a request for map overlay data (from an external web server) only when it seems necessary.</p>
  
  <p>To do this i'm thinking about having screen touch events trigger a counter in an external thread, if the user hovers over a map area without touching the screen for about a second a request is sent.</p>
  
  <p>Event flow would look something like this:</p>
  
  <pre><code>UI Thread      -down press-----release-----down---release----------------------&gt;
                                    v          v       v
  Worker Thread  -----------------start------stop----start---------------send----&gt;
                                   timer======timer   timer==============request
                                          &lt;1s                     1s
  </code></pre>
  
  <p>I'm having trouble getting the UIthread to stop the wait() call in a method and throw an InterruptionException, hence stepping out of the method body before it can execute the request. 
  I basically want to just bypass any msg queue for the thread and have it stop execution instantly though I'm not sure this is possible. Am I on track here? My code for this is shown below:</p>
  
  <pre><code>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---------------------&gt;");
          } catch (InterruptedException e) {
              e.printStackTrace();
              Log.d("TEST", "Received Interruption NIIICE");
          }
  
      }
  }
  }
  </code></pre>
  
  <p>I will keep reading and trying in the mean-time. Thanks :D</p>