Остановка метода в рабочем потоке через прямое прерывание - PullRequest
1 голос
/ 08 мая 2011

Я пытаюсь реализовать способ инициировать запрос данных наложения карты (с внешнего веб-сервера) только тогда, когда это кажется необходимым.

Для этого я думаю о том, чтобы иметь события касания экранавызвать счетчик во внешнем потоке, если пользователь наводит курсор на область карты, не касаясь экрана в течение секунды, и отправляется запрос.

Поток событий будет выглядеть примерно так:1007 * У меня проблемы с получением UIthread, чтобы остановить вызов wait () в методе и выдать исключение InterruptException, поэтому я вышел из тела метода, прежде чем он сможет выполнить запрос.Я в основном хочу просто обойти любую очередь сообщений для потока и сделать так, чтобы она немедленно прекратила выполнение, хотя я не уверен, что это возможно.Я здесь на трассе?Мой код для этого показан ниже:

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 голосов
/ 09 мая 2011

Возможно, вам следует рассмотреть использование метода postDelayed в обработчике вместо вызова wait. Поэтому вы захотите создать Runnable, который будет выполнять ваш запрос, а затем в runOnUp вы сделаете что-то вроде myHandler.postDelayed(onUpRunnable, 1000) Если приходит время отменить этот запрос, просто позвоните myHandler.removeCallbacks(onUpRunnable) Надеюсь, это поможет!

edit: обратите внимание, что запуск останавливается только в том случае, если он еще не запущен. Если это началось, это не будет иметь никакого эффекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...