如何从后台关闭“进度”对话框

时间:2014-09-22 08:02:46

标签: android background-process progressdialog

我对Android有点新意并陷入困境,我不知道如何处理它。

以下是我要做的事情:

来自Activity我在后台完成任务时启动一些任务并显示Progress-Dialog。 如果任务成功完成,请关闭活动并启动新活动。

但是如果在后台我遇到异常,我想回到活动并关闭Progress-Dialog并显示Toast,可能发生了一些异常。

来自活动:

@Override
public void onCreate(Bundle savedInstanceState) 
{
 // my code

 // start Progress Dialog
   showProgressDialog();  
}

public void showProgressDialog()
{
   PD =  new ProgressDialog(getActivity());
   PD.setMessage("Downloading.....");
   PD.show();
}

@Override
public void onDestroy()
{
   super.onDestroy();
   if (PD != null) 
   {
      PD.dismiss();
      PD = null;
   }
}

并在后台:

try 
{
   // perform some db tasks 
   // using AsyncTask 
}
catch (Exception e) 
{
   if(e.getErrorCode() == 34)
   {
      // From here I want go back to Activity and close the Progress dialog
      // and shows what error has occurred.
   }
}

因此,如果发生异常,我想回到活动并关闭那个进度对话框,还是有其他方法可以做到这一点?

3 个答案:

答案 0 :(得分:2)

我知道ProgressDialog在你的UI线程中,你不能在后台线程中访问它。为什么不使用AsyncTask?它易于使用,您可以更轻松地处理它。示例:

class TestAsync extends AsyncTask<Void, Void, Void> {

        private ProgressDialog mDialog;
        private Boolean error = false;

        @Override
        protected void onPreExecute() {

            mDialog = new ProgressDialog(TestActivity.this);
            mDialog.setCancelable(false);
            mDialog.show();

        }

        @Override
        protected Void doInBackground(Void... arg0) {


            try {
                // whatever you would like to do in background
            } catch (Exception e) {
                error = true;
            }

            return null;
        }

        protected void onPostExecute(Void... arg0) {
            mDialog.dismiss();

            if (error) {
                Toast.makeText(getApplicationContext(),
                        R.string.error, Toast.LENGTH_SHORT).show();
                return;
            } else {

                // whatever you would like to do after background 
            } 

        }
    }

答案 1 :(得分:1)

假设AsyncTask是您声明ProgressDialog的Activity的内部类,您可以简单地返回,并在UI线程上运行的onPostExecute中删除它:

假设你的asynctask返回一个String

catch (Exception e) 
{
   if(e.getErrorCode() == 34)
   {
      // From here I want go back to Activity and close the Progress dialog
      // and shows what error has occurred.
      return "34"
   }
}



public void onPostExecute(String result) {
    // dismiss
    // show result
}

答案 2 :(得分:0)

如果任务花费很长时间,则不应在UI踏板上运行它。您应该使用异步任务。

此外,您应该始终检查对话框引用是否仍然存在。

if(dialog!=null && dialog.isShowing())
  dialog.dismiss();

确保异步任务在同一个类上运行,否则使用具有弱引用的侦听器来发布任务的响应。