Alertdialog isShowing始终返回false

时间:2018-08-16 17:55:45

标签: android

    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,因此我彼此之间有多个对话框。

3 个答案:

答案 0 :(得分:0)

您每次都创建一个AlertDialog的新实例

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

并在显示之前检查isShowing()。结果,它总是返回false。

答案 1 :(得分:0)

您的多线程可能会引入一些问题,并且isShowing()的值会在线程之间读取时被缓存。我无法从您的示例中看到innerClass的用途,只需删除它即可。这也类似于:

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

此外,您不应该保留对static的{​​{1}}引用-没必要,它不能与AlertDialog的生命周期很好地配合使用,并且正在等待内存泄漏发生。

答案 2 :(得分:0)

感谢所有尝试在此查询中为我提供帮助的人。最终结果证明是@午夜的愚蠢编码错误。我在内部类线程中有多个runOnUiThreads,其中一个警报对象正在重新创建。