Задачи Android onClick () выполняются одновременно - PullRequest
0 голосов
/ 28 сентября 2011

Я пытаюсь разработать для своего приложения функцию, которая извлекает текстовую строку из Интернета (вроде как в твиттере, но намного более простой) и отображает ее на экране в открывшемся окне. Пользователь видит большое поле с кнопкой обновления рядом с ним и небольшое пространство под обоими, где я хотел бы иметь небольшой монитор прогресса (просто TextView), который отображает «Обновление ...», как только кнопка обновления нажмите, а затем "Обновление успешно!" как только строка текста была успешно извлечена из Интернета и отображена. Это просто для того, чтобы убедить пользователя в том, что что-то действительно происходит, когда он нажимает кнопку.

После лота исследований я пришел к выводу, что способ обновить TextView - это использовать обработчик для выполнения исполняемого файла, который обновит текст в TextView. Итак, мой код выглядит так:

    refreshbutton.setOnClickListener(new View.OnClickListener()
    {
        public void onClick(View abc)
        {
                //display "Refreshing..."
                refreshhandler.post(refreshingmsg);

            /*Code to pull the string of text from the internet goes here (not shown)*/

                //display "Refresh successul!"
                successfulhandler.post(successfulmsg);

                //clear the "Refresh successful" message after 2 seconds
                clearhandler.postDelayed(clearmsg, 2000);
            }
    });

Я надеюсь, что это имеет смысл. Моя проблема в том, что все это происходит одновременно: я хочу, чтобы отобразилось сообщение «Обновление ...», ТОГДА телефон подключился к Интернету, чтобы найти строку текста для обновления, и ТОГДА для «Обновление успешно». msgstr "сообщение, отображаемое после успешного отображения интернет-строки. Но на самом деле происходит то, что ни одна из команд в методе onClick на самом деле не выполняется, пока телефон не извлечет сообщение из Интернета, поэтому сообщение «Обновить ...» вообще не отображается. Итак, что происходит на самом деле, когда пользователь нажимает кнопку, так это то, что в течение секунды или двух ничего не происходит (предположительно, потому что телефон занят извлечением строки из Интернета), а затем неожиданно отображается строка из Интернета вместе с сообщением «Обновить Успешные!».

Так почему это происходит? OnClick должен работать таким образом? Если так, есть ли обходной путь? Я не опубликовал свои операторы runnable и handler, потому что я не уверен, что это будет иметь какое-либо значение ... но если это поможет, тогда я могу опубликовать их!

Кроме того, из этого вы, вероятно, можете сказать, что я давно не занимался android (или даже java), но я стараюсь изо всех сил, поэтому, пожалуйста, будьте осторожны! Спасибо:)

1 Ответ

1 голос
/ 28 сентября 2011

Происходит следующее: ваш код блокирует сетевую связь и не позволяет вашему приложению обновляться со значением обработчика.

Вы должны создать AsyncTask для этой работы за вас.

В методе OnPreExecute измените пользовательский интерфейс, чтобы показать пользователю, что вы обновляете свой контент. Читая ваш код, вы видите, что вы обновляете изображение, сделайте это здесь.

При методе doInBackground, выполняющем фактическую сетевую связь, необязательным шагом является использование onProgressUpdate(Progress...) для обновления пользовательского интерфейса, чтобы уведомить пользователя о том, что операция выполняется.

В методе onPostExecute вы обновляете свой пользовательский интерфейс, чтобы отразить новое содержимое.

Для получения дополнительной информации см. Документацию в AsyncTask , вы также можете выполнить поиск в StackOverflow, здесь есть много хороших вопросов.

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

...