我正在为类开发一个简单的 I.M android 应用程序,该应用程序对服务器进行查询并在 ListView 上显示结果(即消息)。其中一个要求是应用在进行查询时显示无限期进度条。这意味着我必须在查询开始时将进度条小部件设置为 View.VISIBLE,在查询结束时设置为 View.VISIBLE。我遇到的麻烦是查询是在不同的 Java 类中定义的后台函数,所以虽然我想做这样的事情:
ProgressBar pb = (ProgressBar) findViewById(R.id.progressBar);
pb.setVisibility(View.VISIBLE);
...
...
uploader.execute(myCallSpec);
...
...
pb.setVisibility(View.INVISIBLE);
这不起作用,因为服务器调用在后台运行。使用此代码,就好像进度条甚至从未显示过一样。
如何将进度条设置为在服务呼叫开始时显示,然后在呼叫完成后恢复为不可见?
继续使用 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 不处理活动生命周期。
上级:
有两种方法可以访问 AsyncTask 中的进度条实例:
- 只需将其声明为内部类并将进度条保存在外部(主)类的字段中
- 通过构造函数传递引用。(请参阅修改后的示例)
onPostExecute
的 AsyncTask 类中,您应该停止进度条
protected void onPostExecute(Long result) {
pb.setVisibility(View.INVISIBLE);
}
任务完成后调用(在 ui 线程上)