Android 从活动外部关闭进度对话框
我试图在异常发生后关闭“进度”对话框,但我当前的场景不允许我关闭 我有三门课:Android 从活动外部关闭进度对话框,android,background-process,progressdialog,Android,Background Process,Progressdialog,我试图在异常发生后关闭“进度”对话框,但我当前的场景不允许我关闭 我有三门课: 主要活动 二等舱 第三类 在MainActivity中,我正在使用AsyncTask运行任务,并在后台完成任务时显示进度对话框 @Override public void onCreate(Bundle savedInstanceState) { // my code ... BackgroundTask bt = new BackgroundTask(); bt.execute(); } privat
@Override
public void onCreate(Bundle savedInstanceState)
{
// my code ...
BackgroundTask bt = new BackgroundTask();
bt.execute();
}
private class BackgroundTask extends AsyncTask<Void, Void, Void>
{
private ProgressDialog PD;
@Override
protected void onPreExecute()
{
PD = new ProgressDialog(getActivity());
PD.setMessage("Performing background tasks...");
PD.setCancelable(false);
PD.show();
}
@Override
protected Void doInBackground(Void... arg0)
{
// call SecondClass's getMyPhotos method to perform some tasks
// ...
return null;
}
protected void onPostExecute(Void... arg0)
{
Log.i("MainActivity", "--called--");
}
}
最后,在第三节课中,我在AsyncTask中做了一些与互联网相关的事情:
public class ThirdClass
{
// ....
public void internetRelatedStuff()
{
try
{
// again some other stuff...
// LoadImage asyncTask
LoadImage loadImg = new LoadImage();
loadImg.execute();
}
catch(Exception e)
{
if(e.getErrorCode() == 34)
{
// if I get an exception here, how am I suppose to close close Progress dialog
// of MainActivity
}
}
}
private class LoadImage extends AsyncTask<.......>
{
// .....
}
}
公共类第三类
{
// ....
公共空间internetRelatedStuff()
{
尝试
{
//又是一些其他的东西。。。
//LoadImage异步任务
LoadImage loadImg=new LoadImage();
loadImg.execute();
}
捕获(例外e)
{
如果(例如getErrorCode()==34)
{
//如果我在这里遇到异常,我该如何关闭进度对话框
//主要活动
}
}
}
私有类LoadImage扩展了异步任务
{
// .....
}
}
因此,在我的第三个类的try/catch中,如果发生异常,是否可以关闭从MainActivity显示的进度对话框?是的,有多种方法可以做到这一点。您可以将
main活动中的ProgressDialog
对象传递给SecondClass
的getMyPhotos()
方法,然后传递给ThirdClass
构造函数,然后关闭对话框有两种方法可以做到这一点,让我指出两种
您可以将对话框从活动传递到第二类,然后从第二类传递到第三类,并在那里使用它来关闭对话框。。。您将在第二个和第三个类中定义ProgressDialog
在Activity中创建一个静态变量ProgressDialog,并在closeDialogs()中创建一个静态函数
您可以关闭对话框,并使用第三类中的static ref.调用它,
我个人喜欢这个
除了将ProgressDialog对象传递给其他类之外,您还可以告诉我其他方法吗?您可以将ProgressDialog
声明为静态并从任何地方访问它,但请注意,Android中不建议使用静态变量。或者,您可以使用loadImg.get()
而不是loadImg.execute()
来让第一个AsyncTask
等待第二个AsyncTask
的执行,但当我从第三个调用MainActivity的方法来关闭对话框时,PD为空,因此PD.disease()不叫<代码>如果(PD!=null&&PD.isShowing()){PD.disease();}
解释了重新初始化静态字段的原因。尝试使用我建议的第一个或第三个解决方案。它们都应该可以正常工作。请详细说明loadImg.get()
solution。因为我在MainActivity中有我的第一个AsyncTask,而我的第二个AsyncTask在ThirdClass中,所以我应该如何等待第二个AsyncTask在第一个AsyncTask中完成?我已经尝试了第二种方法。在第三个类中,我完成了:MainActivity.closeDialog()代码>在MainActivity中,我将ProgressDialog声明为公共静态ProgressDialog PD;并创建了一个静态方法:publicstaticvoidclosedialog()
if(PD.isShowing())
PD.dismise();
}
但是我在PD得到了一个null点异常。isShowing()私有类BackgroundTask扩展了AsyncTask
{private ProgressDialog PD;//您删除了此声明权限…
是的,我已将其删除,并在onCreate方法之外声明了public static ProgressDialog PD
,并在异步任务中使用了PD。请检查PD是否为null,并查看其行为…if(PD!=null&&PD.isShowing())
if(PD!=null&&PD.isShowing()){PD.dismise();}
也尝试了此操作,未获得NullPointerException,但if语句中的代码未调用。仍显示进度对话框。
public class ThirdClass
{
// ....
public void internetRelatedStuff()
{
try
{
// again some other stuff...
// LoadImage asyncTask
LoadImage loadImg = new LoadImage();
loadImg.execute();
}
catch(Exception e)
{
if(e.getErrorCode() == 34)
{
// if I get an exception here, how am I suppose to close close Progress dialog
// of MainActivity
}
}
}
private class LoadImage extends AsyncTask<.......>
{
// .....
}
}