【发布时间】:2013-09-16 20:02:52
【问题描述】:
我正在尝试在我的应用程序中实现一个进度条,当我的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 正在执行而不只是在它之后显示它?
更新信息:我希望这个示例可以更清楚地说明什么不能按预期工作:
在我的一项活动中(确切地说是我一项活动的片段之一)我想调用一个网络服务。 webservice-method 需要大约十秒钟的时间来回答,因为它很复杂。所以我希望看到从调用 web 服务的那一刻到收到答案的进度条。但是我在调试时可以看到以下内容:
- 调用
onPreExecute并显示对话框,但模拟器只显示白屏 -
doInBackground被调用。在eclipse'LogCat中看到调用了webservice并处理了结果。画面静止。调用网络服务时,模拟器仍然显示白屏。 - 调用
onPostExecute来关闭对话框。在onPostExecute的开头显示最终渲染的屏幕。 - 从
onPostExecute恢复后,对话框会闪烁,然后立即关闭。
希望这有助于理解问题。
编辑:在使用leak window-exception 修复错误后更新源代码。还更新了问题,希望能更清楚。
[2]: Activity has leaked window that was originally added "SO: 泄漏窗口异常
【问题讨论】:
-
查看这篇文章:stackoverflow.com/questions/3821423/…。它对我来说效果很好。
-
doInBackground方法中没有返回字符串,doInBackground中无法处理 UI。 -
@st.检查了它,它对我没有帮助:/
-
在
leaked window问题解决后更新了我的问题,并添加了一些关于我的问题的信息以使其更清晰。
标签: java android android-asynctask android-progressbar