Android: как отключить кнопку сразу после метода setEnabled (false)?

Этот вопрос не ограничивается только Баттоном или этим сеттером. Например, здесь прослушиватель кнопок:

runButton.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                runButton.setEnabled(false);
                runScript();//This function will take a long time!! 
            }
        });

Когда эта кнопка нажата, я хочу, чтобы она была немедленно отключена. Однако на практике я вижу, что эта кнопка не будет отключена до тех пор, пока не закончатся все методы, то есть после завершения метода runScript() кнопка фактически станет серой. Итак, может ли кто-нибудь сказать мне, как сделать кнопку отключенной сразу после этой строки?


person Geeti    schedule 08.11.2011    source источник


Ответы (3)


Что происходит, так это то, что метод runScript блокирует поток пользовательского интерфейса. Что вы хотите сделать внутри своего метода onClick, так это отключить кнопку, а затем запустить скрипт в другом потоке, например

runButton.setEnabled(false);
new Thread(new Runnable() {
    @Override
    public void run() {
            runScript();//This function will take a long time!! 
    }
}).start();

Больше информации можно найти здесь:

person skynet    schedule 08.11.2011
comment
Спасибо. Что я хочу сделать внутри OnClick, так это запустить скрипт, который должен генерировать трафик с сервером, большой трафик, который используется для проверки производительности нашего канала. Я попробую ваше предложение. Большое спасибо! Я не очень разбираюсь в многопоточности. - person Geeti; 09.11.2011

Как правило, вы хотите избегать выполнения чего-либо, что может занять много времени в потоке пользовательского интерфейса. Что вы можете сделать в своем прослушивателе кликов, так это создать новый поток, который выполняет длительный метод в фоновом режиме. Класс Android AsyncTask предоставляет множество методов поддержки для фоновых потоков, которые может отправлять обновления обратно в пользовательский интерфейс через события прогресса.

person Chris    schedule 08.11.2011

Попробуйте вызвать runButton.invalidate() сразу после метода setEnabled(false)

Также

У вас не должно быть долго работающих методов в потоке пользовательского интерфейса, передающем runScript() в асинхронную задачу. Состояние кнопки будет обновляться быстрее

runButton.setOnClickListener(new View.OnClickListener() {

    public void onClick(View v) {
        runButton.setEnabled(false);
        MyTask asyncTask = new MyTask();
        asyncTask.execute();
    }
});
private class MyTask extends AsyncTask<void, void, String> {
 protected String doInBackground(void) {
     runScripts();
     //set to something relevant to your app
     String result ="";
     return result;
 }

 protected void onPostExecute(String result) {
     //do something
 }

}

I

person Rajdeep Dua    schedule 08.11.2011
comment
Большое спасибо! Это так полезно. - person Geeti; 09.11.2011