Проблема с откликом кнопки Android

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

Огромное спасибо,


person Shah    schedule 11.05.2011    source источник


Ответы (4)


Поместите следующий код в свой класс:

 // Need handler for callbacks to UI Threads
    // For background operations
    final Handler mHandler = new Handler();

    // Create Runnable for posting results
    final Runnable mUpdateResults = new Runnable() {
        public void run() {
            // Do your task which needs to get done after webservice call is complete.
        }
    };

А для вызова веб-сервиса используйте следующий код в событии кнопки:

new Thread() {
            public void run() {             
                // Place the webservice call here.   

                mHandler.post(mUpdateResults);
            }
            }.start();

На самом деле то, что вы ищете, - это многопоточность, все вызовы веб-сервисов и сетевые действия должны выполняться в отдельном потоке. После вызова потока start() вы можете делать все, что хотите, и это будет сделано мгновенно без каких-либо задержек (в вашем случае показано, что эта кнопка нажата).

person necixy    schedule 11.05.2011

Вы должны использовать обработчик для этой фоновой операции, уже запрашиваемой в ОС, следуя этой ссылке диалоговое окно прогресса не отображается в Android?

person Sujit    schedule 11.05.2011
comment
Здравствуйте, я удаляю и заново создаю представления в своем приложении. Должен ли я сделать это в отдельном потоке? Сейчас очень медленно - person Ruchir Baronia; 27.11.2015

Вы должны написать класс, скажем, MyWebService и расширить его из AsyncTask. Выполните операцию подключения в его переопределенном методе doInBackground() и обновите любые изменения пользовательского интерфейса в его методе onPostExecute().

person Omar Rehman    schedule 11.05.2011

Создайте новый поток в onClickListener, который выполняет тяжелую работу в фоновом режиме. Таким образом, поток пользовательского интерфейса сможет обновить состояние кнопки:

button.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        new Thread(new Runnable() {

        @Override
        public void run() {
            // Code that connects to web service goes here...
        }
    }).start();
});
person TofferJ    schedule 11.05.2011
comment
Что это делает? Почему это быстрее? Спасибо большое - person Ruchir Baronia; 27.11.2015
comment
Пользовательский интерфейс может быть обновлен только из потока пользовательского интерфейса. Если вы попытаетесь сделать это из другого потока, будет выдано исключение. Кроме того, если вы попытаетесь сделать слишком много работы с потоком пользовательского интерфейса, пользовательский интерфейс перестанет отвечать на запросы. Всегда выполняйте трудоемкие задачи в фоновом потоке и отправляйте результат обратно в поток пользовательского интерфейса, когда вы будете готовы, чтобы обновить пользовательский интерфейс. - person TofferJ; 27.11.2015