Alertdialog isShowing всегда возвращает false
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 и, следовательно, я получаю несколько диалогов друг над другом.
Возможно, есть несколько проблем, возникающих при многопоточности, а значение isShowing()
кэшируется, поскольку оно считывается между потоками. Я не вижу цели innerClass
из вашего примера и просто удалю его. Это также сродни:
private class innerClass extends Thread {
runOnUiThread(new Runnable() {
if(!someDialog.isShowing()) {
somedialog.setMessage("test");
somedialog.show();
}
}
}
Кроме того, вы не должны хранить static
ссылку на свой AlertDialog
- там нет необходимости, она не будет хорошо играть с жизненным циклом вашей Activity
, и это может привести к утечке памяти.
Спасибо всем, кто пытался помочь мне в этом вопросе. Это, наконец, оказывается глупой кодирующей ошибкой @полуночи. У меня есть несколько runOnUiThreads внутри потока innerclass, в одном из которых был восстановлен объект предупреждения.
Вы каждый раз создаете новый экземпляр AlertDialog
new AlertDialog.Builder(ctx).create();
и проверка isShowing()
перед его показом. В результате он всегда возвращает false.