Диалоговое окно прогресса не отображается при загрузке изображений

#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%, но вот мое предположение:

  1. Вы создаете поток, который должен выполняться отдельно от пользовательского потока, но внутри которого вы вызываете runOnUiThread() , который объединяет этот поток с пользовательским потоком.
  2. Вы создаете runnable для запуска в потоке, который создает runnable, который выполняется в другом потоке. Я думаю, вы должны понимать, что это бессмыслица
  3. Ваш loadPictures() , вероятно, замедлит работу пользовательского интерфейса, что может быть причиной того, что вы вообще не видите диалоговое окно выполнения, и как только загрузка будет завершена, вы его отключите.
  4. Я также предполагаю, что вы получаете либо диалоговое окно ANR (приложение не отвечает), либо вы видите много Skipped X frames! The application may be doing too much work on its main thread. сообщений в выходных данных logcat.

Мой совет, и в зависимости от того, что на самом деле делает ваш loadPictures() метод: используйте AsyncTask или, когда вы обращаетесь к серверу для получения изображений, проверьте библиотеки типа Volley или RetroFit и используйте их для получения данных.

Комментарии:

1. вы правы во всех своих догадках… Я использовал AsyncTask, и это сработало просто идеально, спасибо!