Android进度对话框问题

时间:2016-04-21 20:07:53

标签: android progressdialog

我一直在尝试让ProgressDialog工作。

起初,我把它放在活动中,但无论我尝试了多少排列和组合,它都没有出现。

然后我把它移到了AsyncTask里面。我正在初始化并在onPreExecute中显示它,并在onPostExecute中将其解除。

 @Override
 protected void onPreExecute(){
    try {
        dialog = new ProgressDialog(context,
                ProgressDialog.STYLE_SPINNER);
        dialog.setTitle("Please Wait");
        dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        dialog.setIcon(R.drawable.ic_error);
        dialog.show();
    } catch (Exception e) {
        Log.e(TASK_TAG, ExceptionUtils.getStackTrace(e));
    }
}

但是,我不确定应该将什么用作上下文。当我尝试activity.getApplicationContext时,抛出以下异常android.view.WindowManager $ BadTokenException:无法添加窗口 - 令牌null不适用于应用程序。

尝试使用活动时,不显示对话框。

当我在try / catch中附上dialog.show时,它不会显示。当它没有被封闭时,似乎Exception取消了App。

我有几个问题 -

  1. 显示进度对话框的推荐方法是什么?是通过异步任务吗?
  2. 如果是,应该使用什么作为上下文?
  3. 如果它是上述两个选项之一,为什么App会抛出这些例外?

2 个答案:

答案 0 :(得分:1)

我建议在AsyncTask中使用progressDialog,因此AsyncTask和Activity没有链接,活动可能会死亡,asynctask会继续执行。

new YourAsyncTask(context).execute(...);

您必须为Asynctask创建一个自定义构造函数:

private class YourAsyncTask extends AsyncTask<URL, Integer, Long> {

     private Context context;
     private Dialog dialog;

     public YourAsyncTask(Context context){
        this.context = context;
     }

     @Override
     protected void onPreExecute(){
        try {
           dialog = new ProgressDialog(context,
                ProgressDialog.STYLE_SPINNER);
           dialog.setTitle("Please Wait");
           dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
           dialog.setIcon(R.drawable.ic_error);
           dialog.show();
        } catch (Exception e) {
            Log.e(TASK_TAG, ExceptionUtils.getStackTrace(e));
        }
     }

     protected Long doInBackground(URL... urls) {
         ...
     }


     protected void onPostExecute(Long result) {
         if(dialog != null && dialog.isShowing()){
             dialog.dismiss();
         }
         ....
     }
 }

答案 1 :(得分:0)

  

1.显示进度对话的推荐方式是什么?是通过异步任务吗?

- 取决于您的要求。但是,如果您希望在AsyncTask中执行某些操作并且您不希望用户在此期间与您的应用进行交互,则可以在onPreExecute() {AsyncTask中显示对话框{1}}。

  
      
  1. 如果是,那么什么应该用作上下文?
  2.   

- 每次使用ProgressDialog时,上下文都应该是活动上下文,以避免异常。

  
      
  1. 如果它是上述两个选项之一,为什么App会抛出这些例外?
  2.   

- 例外是因为上下文无效。您应该使用Activity上下文;