我正在尝试在我的AsyncTask
获取数据时显示我的应用程序中的进度条。
为此我试图重建这个SO-Answer("SO: How to show a progress spinner")。
但是当我的AsyncTask
结束所有工作已经完成时,我的进度条会显示(并立即被解雇)。一年多以前,“彼得”问了一个类似的答案"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服务。 Web服务方法需要大约十秒钟才能回答,因为它很复杂。因此,我希望看到从调用Web服务的那一刻开始显示进度条,直到收到答案为止。但是,我在debuging时可以看到以下内容:
onPreExecute
并显示对话框,但模拟器仅显示白屏doInBackground
。在eclipse'LogCat
中,我看到调用了web服务并处理了结果。屏幕还在。调用web服务时,模拟器仍会显示白屏。onPostExecute
以关闭对话框。在onPostExecute
的开头显示最终呈现的屏幕。onPostExecute
恢复后,对话框会闪烁,然后立即关闭。希望这有助于理解这个问题。
编辑:使用leak window
- 异常修复错误后更新了源代码。还有更新的问题,希望能让它更清晰。
[2]:Activity has leaked window that was originally added“SO:泄露窗口异常
答案 0 :(得分:2)
1。您的onPostExecute()
从未被称为
因为从protected String doInBackground(Void... params)
你有protected void onPostExecute(final Boolean success)
所以改为
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
if (this.dialog.isShowing()) {
this.dialog.dismiss();
}
}
2。您无法在UI part
中处理/更新 doInBackground()
所以从 doInBackground()
if (this.dialog.isShowing()) {
this.dialog.dismiss();
}
答案 1 :(得分:1)
在onPreExecute()
试试这段代码
class MyTask extends AsyncTask<Void, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
//display dialog here
dialog.show();
}
@Override
protected String doInBackground(Void... params) {
//do your stuff here
return myString;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
//dismiss dialog here
dialog.dismiss();
}
}