增加计数器doinbackground正在运行异步任务

时间:2013-05-08 09:54:58

标签: android performance android-layout

我正在运行异步任务。 在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();
}

2 个答案:

答案 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);
}