【问题标题】:Increase Counter While doinbackground is running async task在 doinbackground 运行异步任务时增加计数器
【发布时间】:2013-05-08 09:54:58
【问题描述】:

我正在运行一个异步任务。 在 doinbackground 方法中,我有一个返回 int 或其他值的方法有时可能是布尔值。

我还想在完成时增加我的进度条。 问题是如何跟踪计数器? 有时数据库查询可能需要一些时间,有时它会更快。 :)

   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();
}

【问题讨论】:

    标签: android performance android-layout


    【解决方案1】:

    在持续时间未知的情况下,您可能应该使用不确定的进度条,您可以通过android:indeterminate 布局属性或setIndeterminate 方法设置它。

    如果你知道你正在执行多少操作,你可以在 asynctask 中保存一个成员变量,或者在 doInBackground 方法中保存一个局部变量。

    【讨论】:

    • 您好,我用过这个工作,但是 0% 并没有随着进度更新而增加
    【解决方案2】:

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

    【讨论】:

    • 不,indeterminate dialog没有进度,只是等待对话框,因为时间估计未知。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多