显示异常的弹出窗口是活动开始

时间:2016-07-19 10:26:07

标签: android popupwindow

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

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

现在,当我在onCreate阶段的任何子活动中执行一些initloader调用时,问题会产生,它曾用于提示异常,即活动已启动。

我用Google搜索了一下,发现了这个程序:

new Handler().post(new Runnable() {
                @Override
                public void run() {
                    cDialog.show();
                }
            });

我工作了,弹出窗口显示..但是,

稍后当onloadfinishsed发生时,我再次关闭弹出窗口。

public void hideCustomDialog() {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            if (cDialog != null && cDialog.isShowing())
                cDialog.dismiss();
        }
    });
}

它工作正常,但现在问题在我调用loader来获取一些数据并且它的结束很快就说了。在那一刻发生的事情是,自从cDialog.show()以来,隐藏加载器被调用了。仍在等待处理程序发布队列。

结果我看到了无限的对话。

有关创意的任何工作吗?

2 个答案:

答案 0 :(得分:0)

您可以创建一个标志,以便在运行size_t startpos = num.find_first_not_of(" "); size_t endpos = num.find_last_not_of(" "); num = num.substr(startpos, endpos-startpos+1); UINT64 input; //= std::strtoull(num.cstr(), NULL, 0); std::istringstream stream (num); stream >> input; 之前了解对话框是否已运行hideCustomDialog()。例如:

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

cDialog.show();

检查是否已完成获取数据:

boolean wasDialogClosed = false;

如果在显示之前尝试关闭对话框,请将flag设置为true:

new Handler().post(new Runnable() {
                @Override
                public void run() {
                    if(!wasDialogClosed){
                        cDialog.show();
                    }
                }
            });

编辑1

这不是一个完美的场景,尽管你可以尝试延迟进程以关闭对话框,以防万一尚未创建:

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

答案 1 :(得分:-1)

您可以使用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();
 }

}