我一直在尝试让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。
我有几个问题 -
答案 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}}。
- 如果是,那么什么应该用作上下文?
醇>
- 每次使用ProgressDialog
时,上下文都应该是活动上下文,以避免异常。
- 如果它是上述两个选项之一,为什么App会抛出这些例外?
醇>
- 例外是因为上下文无效。您应该使用Activity上下文;