我正在运行异步任务。 在doinbackground方法中,我有一个返回int的方法,或者某些其他值可能是布尔值。
我还希望在完成时增加进度条。 问题是如何保持计数器的轨道? 有时db查询可能需要一些时间,有时则会更快。 :)
public void getAllSchoolsSearchResult(InputBean nb , SearchLogic mLogic){
mSRLogic=mLogic;
new AsyncTask<Void, Integer, List<SResultModel>>() {
@Override
protected void onPreExecute() {
super.onPreExecute();
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
mProgressDialog.setProgress(0);
mProgressDialog.setMax(100);
mProgressDialog.show();
}
@Override
protected List<SResultModel> doInBackground(
Void... paramArrayOfParams) {
progressbar_Status=0;
while(progressbar_Status<100){
progressbar_Status += 1;
publishProgress(progressbar_Status);
}
if(ConnectionProvider.checkConnection()==false){
return null;
}
return SearchResultHandler.searchStudent(searchAllSchools);
}
@Override
protected void onPostExecute(List<SResultModel> result) {
super.onPostExecute(result);
if(mProgressDialog!=null&&mProgressDialog.isShowing()){
mProgressDialog.dismiss();
}
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
mProgressDialog.setProgress(values[0]);
}
}.execute();
}
答案 0 :(得分:2)
如果持续时间未知,您可能应该使用不确定的进度条,您可以通过android:indeterminate
布局属性或setIndeterminate
方法设置该进度条。
如果你知道你正在做多少操作,你可以在asynctask中保存一个成员变量,或者在doInBackground
方法中保存一个局部变量。
答案 1 :(得分:1)
不能像这样使用publishProgress。
从您的代码中,您正在显示进度条(什么都不做),然后当它达到100%时,您就会请求学生。
publishProgress应该在
中SearchResultHandler.searchStudent()
取决于它的实施方式。如果它内部没有循环,您将无法发布任何进度。
在这种情况下,使用INDETERMINATE进度对话框,并在doInBackground中不执行任何操作
protected void onPreExecute() {
super.onPreExecute();
mProgressDialog.setIndeterminate(true);
mProgressDialog.show();
}
protected List<SResultModel> doInBackground(Void... paramArrayOfParams) {
if(!ConnectionProvider.checkConnection()) return null;
return SearchResultHandler.searchStudent(searchAllSchools);
}