Alertdialog isShowing всегда возвращает false

-5

    public class myActivity extends Activity
{
private static AlertDialog somedialog = null;

protected void onCreate(Bundle savedInstanceState)
{
somedialog = new AlertDialog.Builder(ctx).create();
innerclass = new innerclass();
innerclass.start();
}
private class innerClass extends Thread
{
if (!somedialog.isShowing())
{
runOnUiThread(new Runnable()
{
somedialog.setMessage("test");
somedialog.show();
}
}
}

}

У меня есть этот код, где у меня есть диалог, который нужно показать, только если диалог еще не существует. Диалог отображается только в innerClass. Другого метода, вызывающего этот объект somedialog, нет.

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

По какой-то причине метод isShowing возвращает false, даже если диалог открыт.

Любые идеи относительно того, почему это происходит?

Однако, когда этот код выполняется somedialog.isShowing() всегда возвращает false и, следовательно, я получаю несколько диалогов друг над другом.

спросил(а) 2021-01-19T15:47:06+03:00 6 месяцев, 1 неделя назад
1
Решение
77

Возможно, есть несколько проблем, возникающих при многопоточности, а значение isShowing() кэшируется, поскольку оно считывается между потоками. Я не вижу цели innerClass из вашего примера и просто удалю его. Это также сродни:

private class innerClass extends Thread {
runOnUiThread(new Runnable() {
if(!someDialog.isShowing()) {
somedialog.setMessage("test");
somedialog.show();
}
}
}

Кроме того, вы не должны хранить static ссылку на свой AlertDialog - там нет необходимости, она не будет хорошо играть с жизненным циклом вашей Activity, и это может привести к утечке памяти.

ответил(а) 2021-01-19T15:47:06+03:00 6 месяцев, 1 неделя назад
45

Спасибо всем, кто пытался помочь мне в этом вопросе. Это, наконец, оказывается глупой кодирующей ошибкой @полуночи. У меня есть несколько runOnUiThreads внутри потока innerclass, в одном из которых был восстановлен объект предупреждения.

ответил(а) 2021-01-19T15:47:06+03:00 6 месяцев, 1 неделя назад
45

Вы каждый раз создаете новый экземпляр AlertDialog

 new AlertDialog.Builder(ctx).create();

и проверка isShowing() перед его показом. В результате он всегда возвращает false.

ответил(а) 2021-01-19T15:47:06+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема