Intereting Posts
Как решить проблему с ограничением компилятора Dalvik по методам 64K? Проблемы с MediaPlayer, исходные ресурсы, остановка и запуск Карты Google api v2 – Тип android.app.Fragment не может быть разрешен. Это косвенно ссылается на требуемые файлы .class Как я могу получать уведомления о том, что Snackbar уволился? Сброс хронометра Делает minHeight делать что-нибудь? Селектор вкладок не работает на предыдущей вкладке, щелкая при прокрутке на просмотрщике Установка ориентации камеры Android началась с намерения ACTION_IMAGE_CAPTURE В чем разница между минимальной версией SDK / целевой версией SDK и компиляцией SDK-версии? Класс мест удален из игровых сервисов android 9.2.0 Опубликовать данные объекта Json, чтобы получить ответ массива Json с помощью volley in android Как защитить открытый ключ Google Play при выполнении InApp Billing Бета-версия в Android-магазине. Где ссылка для тестировщиков? Эмулятор Android 5.0 показывает, что пространство для хранения заканчивается .execute не может быть разрешен для типа – AsyncTask (Android)

Обновить пользовательский интерфейс из потока

Я хочу обновить свой пользовательский интерфейс из потока, который обновляет Progressbar. К сожалению, при обновлении индикатора progressbar от «runnable» индикатор прогресса исчезает! Изменяется возможность onCreate() progressbars в onCreate() с другой стороны!

Какие-либо предложения?

 public void onCreate(Bundle savedInstanceState) { res = getResources(); super.onCreate(savedInstanceState); setContentView(R.layout.gameone); pB.setProgressDrawable(getResources().getDrawable(R.drawable.green)); //**Works**/ handler.postDelayed(runnable, 1); } private Runnable runnable = new Runnable() { public void run() { runOnUiThread(new Runnable() { public void run() { //* The Complete ProgressBar does not appear**/ pB.setProgressDrawable(getResources().getDrawable(R.drawable.green)); } }); } } 

Solutions Collecting From Web of "Обновить пользовательский интерфейс из потока"

Вы должны сделать это с помощью AsyncTask (интеллектуальная задняя нить) и ProgressDialog

AsyncTask обеспечивает правильное и простое использование потока пользовательского интерфейса. Этот класс позволяет выполнять фоновые операции и публиковать результаты в потоке пользовательского интерфейса без необходимости манипулировать потоками и / или обработчиками.

Асинхронная задача определяется вычислением, которое выполняется на фоновом потоке и результат которого публикуется в потоке пользовательского интерфейса. Асинхронная задача определяется тремя универсальными типами, называемыми Params, Progress и Result, и 4 шагами, называемыми begin, doInBackground, processProgress и end.

4 шага

Когда выполняется асинхронная задача, задача выполняет 4 этапа:

onPreExecute() , вызывается в потоке пользовательского интерфейса сразу после выполнения задачи. Этот шаг обычно используется для настройки задачи, например, показывая индикатор выполнения в пользовательском интерфейсе.

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

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

onPostExecute(Result) , вызывается в потоке пользовательского интерфейса после завершения фонового вычисления. Результат вычисления фона передается на этот шаг в качестве параметра. Правила потоковой передачи

Для правильного функционирования этого класса необходимо соблюдать несколько правил потоковой передачи:

Экземпляр задачи должен быть создан в потоке пользовательского интерфейса. Execute (Params …) должен быть вызван в потоке пользовательского интерфейса. Не вызывайте onPreExecute (), onPostExecute (Result), doInBackground (Params …), onProgressUpdate (Прогресс …) вручную. Задача может быть выполнена только один раз (исключение будет выбрано при попытке выполнить второе выполнение).

Пример кода
Что делает адаптер в этом примере, не важно, более важно понимать, что вам нужно использовать AsyncTask для отображения диалога прогресса.

 private class PrepareAdapter1 extends AsyncTask<Void,Void,ContactsListCursorAdapter > { ProgressDialog dialog; @Override protected void onPreExecute() { dialog = new ProgressDialog(viewContacts.this); dialog.setMessage(getString(R.string.please_wait_while_loading)); dialog.setIndeterminate(true); dialog.setCancelable(false); dialog.show(); } /* (non-Javadoc) * @see android.os.AsyncTask#doInBackground(Params[]) */ @Override protected ContactsListCursorAdapter doInBackground(Void... params) { cur1 = objItem.getContacts(); startManagingCursor(cur1); adapter1 = new ContactsListCursorAdapter (viewContacts.this, R.layout.contact_for_listitem, cur1, new String[] {}, new int[] {}); return adapter1; } protected void onPostExecute(ContactsListCursorAdapter result) { list.setAdapter(result); dialog.dismiss(); } } 

Самое простое решение, которое я видел для короткого выполнения потока UI, – это метод post () представления. Это необходимо, так как методы пользовательского интерфейса не являются повторными. Метод для этого:

 package android.view; public class View; public boolean post(Runnable action); 

Метод post () соответствует SwingUtilities.invokeLater (). К сожалению, я не нашел чего-то простого, что соответствует SwingUtilities.invokeAndWait (), но можно построить более позднюю версию на основе прежнего монитора и флага.

Итак, что вы экономите, это создание обработчика. Вам просто нужно найти свое мнение, а затем опубликовать его. Вы можете найти свое мнение через findViewById (), если вы склонны работать с id-ed ресурсами. Полученный код очень прост:

 /* inside your non-UI thread */ view.post(new Runnable() { public void run() { /* the desired UI update */ } }); } 

Примечание. По сравнению с SwingUtilities.invokeLater () метод View.post () возвращает логическое значение, указывающее, имеет ли представление связанную очередь событий. Поскольку я использовал invokeLater () соответственно. Post () в любом случае только для огня и забыть, я не проверял значение результата. В основном вы должны вызывать post () только после того, как onAttachedToWindow () был вызван в представлении.

С наилучшими пожеланиями

Если вы используете Handler (я вижу, что вы делаете и, надеюсь, вы создали свой экземпляр в потоке пользовательского интерфейса), тогда не используйте runOnUiThread() внутри вашей runnable . runOnUiThread() используется, когда вы делаете что-л. Из потока, runnable от UI, однако Handler уже выполнит вашу runnable в потоке пользовательского интерфейса.

Попробуйте сделать что-то вроде этого:

 private Handler mHandler = new Handler(); public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.gameone); res = getResources(); // pB.setProgressDrawable(getResources().getDrawable(R.drawable.green)); **//Works** mHandler.postDelayed(runnable, 1); } private Runnable runnable = new Runnable() { public void run() { pB.setProgressDrawable(getResources().getDrawable(R.drawable.green)); pB.invalidate(); // maybe this will even not needed - try to comment out } }; 

Используйте класс AsyncTask (вместо Runnable). У него есть метод под названием onProgressUpdate, который может повлиять на пользовательский интерфейс (он вызывается в потоке пользовательского интерфейса).

Вам нужно создать Handler в потоке пользовательского интерфейса, а затем использовать его для публикации или отправки сообщения из другого потока для обновления пользовательского интерфейса

Если вам не нравится AsyncTask, вы можете использовать шаблон наблюдателя . В этом примере используйте ResponseHandler как внутренний класс в вашей деятельности, затем введите строковое сообщение, в котором будет задан процент выполнения баров … Вам нужно убедиться, что любые изменения в пользовательском интерфейсе выполняются в ResponseHandler, чтобы избежать замораживания UI, то ваш рабочий поток (EventSource в примере) может выполнять требуемые задачи.

Я бы использовал AsyncTask tho, однако шаблон наблюдателя может быть полезен по причинам настройки, а также его легче понять. Также я не уверен, что этот способ широко принят или будет работать на 100%. Im загружает и плагин Android теперь, чтобы проверить его