Android:服务器调用例程的不确定进度条。

Android:服务器调用例程的不确定进度条。,android,json,gson,android-progressbar,Android,Json,Gson,Android Progressbar,我正在开发一个简单的I.m android类应用程序,它可以向服务器进行查询,并在列表视图中显示结果(即消息)。其中一个要求是,在进行查询时,应用程序显示一个不确定的进度条。 这意味着我必须将ProgressBar小部件设置为在查询开始时查看.VISIBLE,在查询结束时查看.VISIBLE。 我遇到的问题是,查询是在另一个Java类中定义的后台函数,因此,尽管我想这样做: ProgressBar pb = (ProgressBar) findViewById(R.id.prog

我正在开发一个简单的I.m android类应用程序,它可以向服务器进行查询,并在列表视图中显示结果(即消息)。其中一个要求是,在进行查询时,应用程序显示一个不确定的进度条。 这意味着我必须将ProgressBar小部件设置为在查询开始时查看.VISIBLE,在查询结束时查看.VISIBLE。 我遇到的问题是,查询是在另一个Java类中定义的后台函数,因此,尽管我想这样做:

        ProgressBar pb = (ProgressBar) findViewById(R.id.progressBar);
        pb.setVisibility(View.VISIBLE);
        ...
        ...
        uploader.execute(myCallSpec);
        ...
        ...
        pb.setVisibility(View.INVISIBLE);
这不起作用,因为服务器调用在后台运行。使用这段代码,就好像从来没有显示过进度条


如何将进度条设置为在服务呼叫开始时显示,然后在呼叫完成时恢复为不可见

onPostExecute
方法中的AsyncTask类中,您应该停止progressbar

protected void onPostExecute(Long result) {
         pb.setVisibility(View.INVISIBLE);
}

它在任务完成后调用(在ui线程上)

继续异步任务

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()
类MyTask扩展了AsyncTask{
私人ProgressBar pb;
公共MyTask(ProgressBar pb){
这是1.pb=pb;
}
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
pb.setVisibility(View.VISIBLE);
}
@凌驾
受保护的Void doInBackground(Void…参数){
//你的问题在这里。
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
super.onPostExecute(结果);
pb.setVisibility(View.GONE);
}
}
MyTask mt=新的MyTask(pb);
mt.execute()
但在实际项目中,我建议您使用类似的方法。默认情况下,AsyncTask不处理活动生命周期

UPD:

有两种方法可以访问AsyncTask中的ProgressBar实例:

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

  • 上传程序是异步任务吗?是的。设置为:uploader=newservercall();其中ServerCall是一个扩展AsyncTask类的类。但我不允许对该类进行任何更改。好的,我可以看到该策略将如何工作,但我如何从该类中访问pb和其他外部变量?@JosephFaulkner请参阅修改后的answerOk,当在另一个类中定义pb时,我将如何像这样访问pb?在构造函数中添加参数