【问题标题】:How to get a smooth progression of the progressBar during establishing a connection to the server?在建立与服务器的连接期间如何获得progressBar的平稳进展?
【发布时间】:2013-11-20 07:42:23
【问题描述】:

大多数关于如何使用publishProgress 的示例在非常少的离散步骤中调用它(例如http://www.java2s.com/Code/Android/Network/UsingAsyncTasktodownloadabigfile.htm),通常在httpClient.execute 之前和之后调用一个。

在我的应用程序中,我注意到大部分时间(比如 3 秒)都用于建立与服务器的连接。

因此,在那段时间里,我的进度条对用户来说似乎停滞不前。为了给他视觉上的反馈,告诉他背景中还有什么事情发生,我想在等待期间为进度条设置动画。例如。从 0% 开始,每半秒增加 2% 的进度,同时等待从 httpClient.execute 回来(例如最多 60%)。

如果有任何建议,我将不胜感激。

【问题讨论】:

    标签: android android-asynctask progress-bar


    【解决方案1】:

    execute() 运行时使用Handler 更新ProgressBar。例如在AsyncTaskonPreExecute() 中开始一个Runnable,如下所示:

    private static final int UPDATE_STEP = 500; // My convention is to update the progress with 1 for every 500ms
    private Handler mHandler = new Handler();
    private Runnable mRunnable = new Runnable() {
    
         @Override
         public void run() {
              progressBar.setProgress(progressBar.getProgress() + 1); 
              mHandler.postDelayed(this, UPDATE_STEP);
         }
    
    }
    
    @Override
    public void onPreExecute() {
        mHandler.postDelayed(mRunnable, UPDATE_STEP); 
    }
    

    doInBackground()方法中,execute()调用结束后:

    mHandler.removeCallbacks(mRunnable);// cancel the manual ProgressBar updates
    int remainderProgress = 100 - progressBar.getProgress(); // I assumed that 100 is the max progress
    

    【讨论】:

    • 这正是我想要的。如果您编辑以下内容,您的代码将开箱即用:removeCallbacks 需要 runnable 作为参数:mHandler.removeCallbacks(mRunnable);
    • @HartmutPfitzinger 是的,removeCallbacks() 需要 Runnable,这让我感到困惑。我已经编辑了答案来纠正这个问题。
    猜你喜欢
    • 2015-06-13
    • 2021-01-06
    • 2018-11-28
    • 2017-08-31
    • 2016-12-21
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多