Код не выполняется, когда диалоговое окно Android слишком быстро отвечает (состояние гонки) - PullRequest
4 голосов
/ 27 апреля 2011

В моем приложении для Android у меня есть диалоговое окно с таким кодом:

.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int id) {
    dialog.cancel();
    doStuff();
    doMorestuffThatTakesTime();
}
})

Я заметил, что, если я нажимаю кнопку «Да» очень быстро, код в doStuff () не выполняется. Я задавался вопросом, имеет ли отношение диалог dialog.cancel (), но проблема существует, даже если он был перенесен в конец и также полностью удален.

Похоже на какое-то состояние гонки, но в чем проблема и как мне это исправить?

1 Ответ

0 голосов
/ 27 апреля 2011

Внимание.Еще одно доказательство концептуального кода: вы можете попробовать запустить поток при клике, как в:

    builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {               //cancels itself?
            Thread thread= new Thread( new Runnable() {
                public void run() {
                    try{
                    Thread.sleep(3000); //<== mimic time intensive task
                    }
                    catch(Exception e){             
                    }
                    Log.d(TAG,"done");
                    myHandler.sendEmptyMessage(0);
                }
            });
            thread.setDaemon(true);
            thread.start();
            dialog.dismiss();
        }       
    });

И перехватить сообщение в одном обработчике действий:

private Handler myHandler= new Handler(){
    @Override
    public void  handleMessage(Message msg){        
        switch(msg.what){
            case 0:
                this.removeMessages(0);
                Log.d(TAG,"gotit");
             break;
            default:
                super.handleMessage(msg);
                break;
        }
    }
};

Это НЕ БУДЕТработать, если вы пытаетесь прикоснуться к пользовательскому интерфейсу из новой темы.

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