Я создаю диалог, который показывает текущий прогресс и закрывается через 1 секунду для эксперимента. Следующий код действительно показывал диалог.

/** Show progress dialog */
public static View showProgressDialog(Context context) {
    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
    View dialogView = inflater.inflate(R.layout.window_progress_dialog, null);

    builder.setTitle(R.string.msg_progress_loading);
    builder.setView(dialogView);
    builder.setCancelable(false);

    builder.setPositiveButton(null, null);
    builder.show();

    return dialogView;
}

Но если я сделаю это так, диалог не появится.

/** Show progress dialog */
public static View showProgressDialog(Context context) {
    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
    View dialogView = inflater.inflate(R.layout.window_progress_dialog, null);

    builder.setTitle(R.string.msg_progress_loading);
    builder.setView(dialogView);
    builder.setCancelable(false);

    builder.setPositiveButton(null, null);
    final AlertDialog alertDialog = builder.show();
    new Handler().post(new Runnable() {
        @Override
        public void run() {
            SystemClock.sleep(1000);
            alertDialog.dismiss();
        }
    });

    return dialogView;
}

Я что-то упускаю?

0
Moses 26 Ноя 2021 в 07:26
Увеличьте время сна и проверьте
 – 
Chandrakanth
26 Ноя 2021 в 07:30
new Handler() создает этот Handler для текущего потока, который является потоком пользовательского интерфейса, поэтому SystemClock.sleep(1000) вешает пользовательский интерфейс. Возможно, вы хотели использовать вместо этого postDelayed(new Runnable() { ... }, 1000) без sleep().
 – 
Mike M.
26 Ноя 2021 в 07:31
Для отображения диалогового окна выполнения нет необходимости возвращать какие-либо представления или что-либо еще, просто измените тип метода void и покажите диалоговое окно, как вы написали в первую очередь.
 – 
pratik vekariya
26 Ноя 2021 в 07:40
Похоже на пост тролля
 – 
KINYUA TIMOTHY NJIRU
26 Ноя 2021 в 07:47

1 ответ

Лучший ответ

Любая задача, которую вы публикуете в Handler, выполняется в основном потоке / потоке пользовательского интерфейса. Поэтому, когда вы вызываете для него sleep(), весь поток пользовательского интерфейса (отвечающий за отображение диалогового окна) останавливается на секунду.

Поэтому используйте вместо этого Handler.postDelayed().

new Handler().postDelayed(new Runnable() {
     @Override
     public void run() {
         alertDialog.dismiss();
     }
}, 1000); //milliseconds

Здесь вы говорите основному потоку закрыть диалоговое окно, но вы говорите это через 1 секунду (с задержкой). Это может работать не на всех устройствах, поскольку потоку пользовательского интерфейса может потребоваться больше секунды, чтобы отобразить диалог на устройствах с низкой производительностью. Поэтому подумайте об увеличении времени задержки.

0
Roshana Pitigala 26 Ноя 2021 в 08:09