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

我试图在异常发生后关闭“进度”对话框,但我当前的场景不允许我关闭

我有三门课:

  • 主要活动
  • 二等舱
  • 第三类
  • MainActivity中,我正在使用AsyncTask运行任务,并在后台完成任务时显示进度对话框

    @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<.......> 
    {
     // .....
    }   
    
    }