【问题标题】:Android Progress Dialog IssueAndroid 进度对话框问题
【发布时间】:2016-04-21 20:07:52
【问题描述】:

我一直在尝试让 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: Unable to add window -- token null 不适用于应用程序。

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

当我将 dialog.show 包含在 try / catch 中时,它不显示。当它没有被封闭时,似乎异常会关闭应用程序。

我有几个问题-

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

【问题讨论】:

  • 显示您的代码。您应该使用当前活动活动的上下文

标签: android progressdialog


【解决方案1】:

我建议在您的 AsyncTask 中使用 progressDialog,因此 AsyncTask 和 Activity 没有链接,有可能 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();
         }
         ....
     }
 }

【讨论】:

  • 这就是这样做的方法,在上下文中传递。使用 publishProgress() 以增量方式更新进度条。 AsyncTask 有一个名为 onProgressUpdate() 的方法,例如,您可以在每次迭代或每次在 doInBackground() 期间完成进度时调用该方法。
【解决方案2】:

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

-- 取决于您的要求。但是,如果您想在AsyncTask 中进行一些操作并且您不希望用户在此期间与您的应用程序交互,您可以在AsyncTaskonPreExecute() 中显示对话框。

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

--每次使用ProgressDialog时,上下文都应该是activity上下文,以免出现异常。

  1. 如果是上面提到的两个选项之一,为什么 App 会抛出这些异常?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多