java-AsyncTask工作时不显示进度栏
作者:互联网
我正在尝试在我的应用程序中实现进度条,该进度条在AsyncTask提取数据时显示.
为此,我尝试重建此SO-Answer(“SO: How to show a progress spinner”).
但是,当所有工作都已经完成时,我的进度条就会显示在AsyncTask的末尾(并立即被关闭). “ Peter”一年多以前曾问过类似的答案“here”,但没有得到任何解答.
这是我的AsyncTask.信息:AppActivity是应用程序中所有活动的父类.有些包含片段,有些则没有.有些使用我的RESTTask.
public class RESTTask extends AsyncTask<Void, Void, String> {
protected AppActivity AppActivity;
/*
* Special constructor to pass the activity
*/
public RESTTask(AppActivity activity) {
AppActivity = activity;
}
@Override
protected String doInBackground(Void... params) {
String resultstring = "";
// fetch data from a webservice
return resultstring;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
if (AppActivity != null) {
AppActivity.showDialog();
}
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
if (AppActivity != null) {
AppActivity.dismissDialog();
}
}
}
我的AppActivity:
public class AppActivity extends Activity {
public ProgressDialog dialog;
@Override
protected void onResume() {
super.onResume();
dialog = new ProgressDialog(this);
}
public void showDialog() {
this.dialog.setMessage(getString(R.string.Please_wait));
this.dialog.show();
}
public void dismissDialog() {
if (this.dialog.isShowing()) {
this.dialog.dismiss();
}
}
}
所以我现在的问题是:如何正确实现进度条,以便它不仅在AsyncTask之后而且还在执行时都显示出来?
更新了信息:我希望这个例子可以使无法正常工作的情况更加清楚:
在我的一项活动中(确切地说是其中一项活动的片段之一),我想调用一个Web服务.由于复杂性,webservice方法大约需要十秒钟来回答.因此,我希望从调用Web服务的那一刻开始,直到收到答案为止,都会显示进度条.但是我在调试时可以看到以下内容:
>调用onPreExecute并应显示对话框,但仿真器仅显示白屏
>将调用doInBackground.在eclipse的LogCat中,我看到调用了Web服务,并且处理了结果.屏幕静止不动.调用Web服务时,模拟器静止图像会显示白屏.
>调用onPostExecute以关闭对话框.在onPostExecute的开始处,显示最终渲染的屏幕.
>从onPostExecute恢复后,对话框将闪烁并在此后立即关闭.
希望这有助于理解问题.
编辑:修复了泄漏窗口例外的错误后,更新了源代码.还更新了问题,希望可以使其更清楚.
[2]:Activity has leaked window that was originally added“ SO:泄漏的窗口异常
解决方法:
1.永远不会调用您的onPostExecute()
因为您从受保护的字符串doInBackground(Void … params)返回了String
并且您已保护void onPostExecute(最终布尔成功)
因此更改为
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
if (this.dialog.isShowing()) {
this.dialog.dismiss();
}
}
2.您不能在doInBackground()中处理/更新UI部件
因此,请从doInBackground()中删除以下内容
if (this.dialog.isShowing()) {
this.dialog.dismiss();
}
标签:android-asynctask,android-progressbar,java,android 来源: https://codeday.me/bug/20191122/2062413.html