Android:ServerCall 例程的不确定进度条。
Android: Indeterminate progress bar for ServerCall routine.
我正在为 class 开发一个简单的 I.M android 应用程序,它可以查询服务器并在 ListView 上显示结果(即消息)。其中一项要求是应用程序在进行查询时显示不确定的进度条。
这意味着我必须在查询开始时将 ProgressBar 小部件设置为 View.VISIBLE,在查询结束时设置为 View.INVISIBLE。
我遇到的问题是查询是在不同的 Java class 中定义的后台函数,所以虽然我想做这样的事情:
ProgressBar pb = (ProgressBar) findViewById(R.id.progressBar);
pb.setVisibility(View.VISIBLE);
...
...
uploader.execute(myCallSpec);
...
...
pb.setVisibility(View.INVISIBLE);
这不起作用,因为服务器调用在后台运行。使用此代码,就好像从未显示过进度条一样。
如何将进度条设置为在服务调用开始时显示,然后在调用完成时恢复为不可见?
在你的 AsyncTask class 在 onPostExecute
方法中你应该停止 progressbar
protected void onPostExecute(Long result) {
pb.setVisibility(View.INVISIBLE);
}
它在任务完成后调用(在 ui 线程上)
继续使用 AsyncTask
class MyTask extends AsyncTask<Void, Void, Void> {
private ProgressBar pb;
public MyTask(ProgressBar pb) {
this.pb = pb;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
pb.setVisibility(View.VISIBLE);
}
@Override
protected Void doInBackground(Void... params) {
//Your query here.
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
pb.setVisibility(View.GONE);
}
}
MyTask mt = new MyTask(pb);
mt.execute()
但是在实际项目中我建议你使用类似RoboSpice的东西。同样,AsyncTask 默认不处理 activity 生命周期。
UPD:
有两种方法可以访问 AsyncTask 中的 ProgressBar 实例:
- 只需将其声明为内部 class 并将 ProgressBar 保存在外部(主)字段中 class
- 通过构造函数传递引用。 (参见修改示例)
我正在为 class 开发一个简单的 I.M android 应用程序,它可以查询服务器并在 ListView 上显示结果(即消息)。其中一项要求是应用程序在进行查询时显示不确定的进度条。 这意味着我必须在查询开始时将 ProgressBar 小部件设置为 View.VISIBLE,在查询结束时设置为 View.INVISIBLE。 我遇到的问题是查询是在不同的 Java class 中定义的后台函数,所以虽然我想做这样的事情:
ProgressBar pb = (ProgressBar) findViewById(R.id.progressBar);
pb.setVisibility(View.VISIBLE);
...
...
uploader.execute(myCallSpec);
...
...
pb.setVisibility(View.INVISIBLE);
这不起作用,因为服务器调用在后台运行。使用此代码,就好像从未显示过进度条一样。
如何将进度条设置为在服务调用开始时显示,然后在调用完成时恢复为不可见?
在你的 AsyncTask class 在 onPostExecute
方法中你应该停止 progressbar
protected void onPostExecute(Long result) {
pb.setVisibility(View.INVISIBLE);
}
它在任务完成后调用(在 ui 线程上)
继续使用 AsyncTask
class MyTask extends AsyncTask<Void, Void, Void> {
private ProgressBar pb;
public MyTask(ProgressBar pb) {
this.pb = pb;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
pb.setVisibility(View.VISIBLE);
}
@Override
protected Void doInBackground(Void... params) {
//Your query here.
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
pb.setVisibility(View.GONE);
}
}
MyTask mt = new MyTask(pb);
mt.execute()
但是在实际项目中我建议你使用类似RoboSpice的东西。同样,AsyncTask 默认不处理 activity 生命周期。
UPD:
有两种方法可以访问 AsyncTask 中的 ProgressBar 实例:
- 只需将其声明为内部 class 并将 ProgressBar 保存在外部(主)字段中 class
- 通过构造函数传递引用。 (参见修改示例)