Заполнение списка в отдельной теме
В упражнении я загружаю строки списка, что занимает много времени, поэтому я помещаю эту задачу в отдельный поток, чтобы можно было отображать progressDialog.
Я делаю следующее
<code>private void doMyStuff() { listItems.clear(); progressDialog.show(); new Thread(new Runnable() { @Override public void run() { for () { listItems.add(something to add); } handler.sendEmptyMessage(0); progressDialog.dismiss(); } }).start(); } private Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { if (msg.what == 0) { adapter.notifyDataSetChanged(); } }; }; </code>
У меня иногда есть ошибка, которая вызывает исключение IllegalStateException. Прежде всего, я был удивлен, потому что программирование потока, как это я обычно делаю в стандартных программах Java.
Ошибка появляется только & quot; иногда & quot; и он не появляется при пошаговой отладке.
Это привело меня к поиску в Интернете, и я нашел в SO несколько вопросов, связанных с этим, и я должен признать, что вещи не ясны для меня.
Поскольку я вызываю notifyDataSetChanged () только после завершения потока, почему он иногда вызывает исключение.
Может ли кто-нибудь подтвердить мне, что этот способ неправильный, и что я ДОЛЖЕН использовать асинхронную задачу и, возможно, объяснить мне, почему ???
Мне нужно, чтобы отображался progressDialog, может кто-нибудь дать мне простой пример AsyncTask, заполняющего представление списка И отображающий progressDialog заполняющего прогресса.
Спасибо
UPDATE
Jtanveer дал мне ответ на асинктивный вопрос. Теперь другие отметили, что увольнение не в обработчике, что я исправляю.
Согласно статье, опубликованной jtanveer на тему «Безболезненная резьба» они говорят, что
Android предлагает несколько способов доступа к потоку пользовательского интерфейса из других потоков, одним из которых является HANDLER.
Кто-то знает, почему помещение уволенного в обработчик не решило мою проблему? для меня listItem.add не имеет ничего общего с пользовательским интерфейсом? Я не прав в этом вопросе?
Для меня в моем коде единственный интерфейс это адаптер и progressdialog? Любые комментарии или объяснения приветствуются.
FINAL ANSWER
stjom дал рабочий ответ для моего конкретного кода. Запуск runOnUiThread в обработчике. Это работает, но я удивлен, потому что я думал, что обработчик был запущен в потоке пользовательского интерфейса ...
Спасибо всем за все ваши ответы.