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