Android 弹出窗口显示异常活动已启动

Android 弹出窗口显示异常活动已启动,android,popupwindow,Android,Popupwindow,我有一个基类和子类结构的Android项目。所以基本上基类中的大多数方法都可以被子活动使用 现在,我创建了一个自定义加载类型popupwindow,它的方法体位于基类中,以便所有子活动都可以使用相同的方法 现在,当我在onCreate阶段的任何子活动中调用initloader时,问题就产生了,它通常会给出一个异常,表示活动已启动 我在谷歌上搜索了一下,发现了以下程序: new Handler().post(new Runnable() { @Override

我有一个基类和子类结构的Android项目。所以基本上基类中的大多数方法都可以被子活动使用

现在,我创建了一个自定义加载类型popupwindow,它的方法体位于基类中,以便所有子活动都可以使用相同的方法

现在,当我在onCreate阶段的任何子活动中调用initloader时,问题就产生了,它通常会给出一个异常,表示活动已启动

我在谷歌上搜索了一下,发现了以下程序:

new Handler().post(new Runnable() {
                @Override
                public void run() {
                    cDialog.show();
                }
            });
我工作了,弹出窗口显示。。但是,

稍后,当onLoadFinished出现时,我再次关闭弹出窗口

public void hideCustomDialog() {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            if (cDialog != null && cDialog.isShowing())
                cDialog.dismiss();
        }
    });
}
它工作得很好,但是现在当我调用loader获取一些数据时,问题就产生了,比如说,它很快就完成了。此时发生的情况是,自cDialog.show()以来,hideloader被调用得更早;仍在等待处理程序post队列

因此,我看到了一个无限的对话


有什么解决方法吗?

您可以创建一个标志,在运行
cDialog.show()之前知道对话框是否运行了
hideCustomDialog()
。例如:

在运行加载程序之前,将标志初始化为false:

boolean wasDialogClosed = false;
检查是否已完成数据提取:

new Handler().post(new Runnable() {
                @Override
                public void run() {
                    if(!wasDialogClosed){
                        cDialog.show();
                    }
                }
            });
如果在显示对话框之前尝试关闭该对话框,请将标志设置为true:

public void hideCustomDialog() {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            if (cDialog != null && cDialog.isShowing()){
                cDialog.dismiss();
            }
            else{
                wasDialogClosed = true;
            }
        }
    });
}
编辑1

这不是一个完美的方案,尽管您可以尝试延迟关闭对话框的过程,以防对话框尚未创建:

public void hideCustomDialog() {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            if (cDialog != null && cDialog.isShowing()){
                cDialog.dismiss();
            }
            else{
                Handler mHandler = new Handler();
                //Close the dialog after one sec
                mHandler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        runOnUiThread(new Runnable() {
                            public void run() {

                                cDialog.dismiss();

                            }

                        });
                    }
                }, 1000);
            }
        }
    });
}

您可以使用AsyncTask执行类似的工作。 只需在onPreExecute中加载对话框,并在onPostExecute中关闭它

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
 protected Long doInBackground(URL... urls) {
   //Your Code
 }
 protected void onPreExecute() {
       cDialog.show();
    }
 protected void onPostExecute(Long result) {
   if (cDialog != null && cDialog.isShowing()){
            cDialog.dismiss();
 }
私有类下载文件任务扩展异步任务{
受保护的长doInBackground(URL…URL){
//你的代码
}
受保护的void onPreExecute(){
cDialog.show();
}
受保护的void onPostExecute(长结果){
if(cDialog!=null&&cDialog.isShowing()){
cDialog.disclose();
}

}

错误是什么?共享stacktraceThere没有错误,它只是在showloader之前调用hideloader,因此弹出窗口实际上从未关闭尝试避免此过程,因为该方法在我的基本活动中,因此如果有可能多次出现,这是不好的。还有其他解决方法吗?Naa,因为自定义加载弹出窗口是genrelised对于所有可能的情况,不能冒险延迟1秒。无论如何,谢谢,可能我必须去做标记的事情。不,我已经在使用loader,我不需要使用Asynctask。