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 实例:

  1. 只需将其声明为内部 class 并将 ProgressBar 保存在外部(主)字段中 class
  2. 通过构造函数传递引用。 (参见修改示例)