#android #multithreading #progressdialog
#Android #многопоточность #progressdialog
Вопрос:
Мне нужно загрузить несколько изображений в основной поток, и я хочу показать диалоговое окно загрузки, пока это происходит, но почему-то я не могу показать диалоговое окно выполнения…
Мой код ниже:
private ProgressDialog progress;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.background);
progress = ProgressDialog.show(this, "",getString(R.string.background_loading), true);
LoadBackgrounds loadB = new LoadBackgrounds();
new Thread(loadB).start();
}
public class LoadBackgrounds implements Runnable {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
loadPictures();
progress.dismiss();
}
});
}
}
loadPictures()
должно вызываться внутри runOnUiThread
, потому что это изменяет представления.
Итак, почему диалоговое окно прогресса не отображается во время загрузки изображений?
Комментарии:
1. Я не могу дать вам точный ответ о вашей проблеме, но AsyncTask может выполнить это без проблем: выполните загрузку изображений в фоновом режиме и после завершения выполнения.отклонить
2. возможно, диалоговое окно выполнения не отображается, потому что вы закрываете диалоговое окно внутри метода run. проверьте после выполнения комментария.dismiss(); этот код.
3. Вам нужен другой поток для отображения диалогового окна.. вы можете использовать AsynTask .
Ответ №1:
Я не уверен на 100%, но вот мое предположение:
- Вы создаете поток, который должен выполняться отдельно от пользовательского потока, но внутри которого вы вызываете
runOnUiThread()
, который объединяет этот поток с пользовательским потоком. - Вы создаете runnable для запуска в потоке, который создает runnable, который выполняется в другом потоке. Я думаю, вы должны понимать, что это бессмыслица
- Ваш
loadPictures()
, вероятно, замедлит работу пользовательского интерфейса, что может быть причиной того, что вы вообще не видите диалоговое окно выполнения, и как только загрузка будет завершена, вы его отключите. - Я также предполагаю, что вы получаете либо диалоговое окно ANR (приложение не отвечает), либо вы видите много
Skipped X frames! The application may be doing too much work on its main thread.
сообщений в выходных данных logcat.
Мой совет, и в зависимости от того, что на самом деле делает ваш loadPictures()
метод: используйте AsyncTask или, когда вы обращаетесь к серверу для получения изображений, проверьте библиотеки типа Volley
или RetroFit
и используйте их для получения данных.
Комментарии:
1. вы правы во всех своих догадках… Я использовал AsyncTask, и это сработало просто идеально, спасибо!