Android Progress进度条代码,进度条刷新问题探讨

转载注明出处,Lee http://blog.csdn.net/hnulwt/article/details/44462177

今天看到讨论说关于进度条走的慢的问题。实际问题是这样的:后台执行的程序速度会很快,但是在界面上感觉得到进度条是走的比较慢的。为此,做了一个小实验,代码上实验在1秒的时间 通过俩种方式增加进度条至100%(每隔10ms增加1%和 每隔250ms增加25%),验证哪种方式给人的感觉快,但是在demo做出来之后,确发现了新的问题,想在此与大家共同讨论。

问题

根据代码,我预想的结果应该是俩个进度条增加的速度相同,但是经过我的测试,点击 同时增加 按钮,跳跃增加那个进度条总是会比逐步增加的进度条要快。

界面如下(源码及布局文件在后面):

分析:

通过Handler机制更新Progress,在点击“同时增加”按钮后,分别post两个Runnable对象到消息队列,然后执行Runnable里面的run方法,在进度数值增加后 发送message到消息队列,最后handleMessage,更新进度条,然后再分别post Runnable对象。。。如此循环直到进度条满。

目前的结论

通过测试 “逐步增加”“跳跃增加”“同时增加”三个执行过程的TraceView,结果看不出有什么差别。看了相关的源码,觉得在处理过程中耗时操作就是this锁了吧。由于每隔10ms增加1%发送消息太频繁、界面更新也频繁,会导致逐步增加的速度偏慢。不知各位大神如何看这个问题,希望大家不吝赐教。

在贴源码之前先说一句,网上查到的一些利用Handler更新进度条的代码是有问题的。他在removeCallbacks之前又post了runnable,导致remove掉上一个runnable后又加入一个新的runnable,这样无限循环下去,占用资源。

Demo

MainActivity.java

package com.example.progress;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;

public class MainActivity extends Activity implements OnClickListener
{
    private static final int PERCENT_TOTAL = 100;
    ProgressBar mProgressFluency, mProgressJumpy;

    int percentFluency  = 0;
    int percentJumpy    = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mProgressFluency = (ProgressBar) findViewById(R.id.progressBar1);
        mProgressJumpy = (ProgressBar) findViewById(R.id.progressBar2);

        ((Button) findViewById(R.id.button_fluency)).setOnClickListener(this);
        ((Button) findViewById(R.id.button_jumpy)).setOnClickListener(this);
        ((Button) findViewById(R.id.button_reset)).setOnClickListener(this);
        ((Button) findViewById(R.id.button_syn_increase)).setOnClickListener(this);
    }

    final Handler mHandler  = new Handler() {

                                    public void handleMessage(Message msg)
                                    {
                                        super.handleMessage(msg);
                                        switch (msg.what)
                                        {
                                            case What.FLUENCY:
                                                mProgressFluency.setProgress(msg.arg1);
                                                mHandler.post(mUpdateProgressFluency);
                                                break;
                                            case What.JUMPY:
                                                mProgressJumpy.setProgress(msg.arg1);
                                                mHandler.post(mUpdateProgressJumpy);
                                                break;
                                            default:
                                                break;
                                        }
                                    }
                                };

    static class What
    {
        final static int    FLUENCY = 1;
        final static int    JUMPY   = 2;
    }

    final Runnable mUpdateProgressFluency = new Runnable() {
            final int everyTimeAddF = 1;
            final int delay = 1000 / (100 / everyTimeAddF);

            @Override
            public void run()
            {
                percentFluency += everyTimeAddF;

                if (percentFluency > PERCENT_TOTAL)
                {
                    mHandler.removeCallbacks(mUpdateProgressFluency);
                }
                else
                {
                    Message msg = mHandler.obtainMessage();
                    msg.arg1 = percentFluency;
                    msg.what = What.FLUENCY;
                    mHandler.sendMessageDelayed(msg, delay);
                }
            }
        };

    final int       everyTimeAdd            = 25;
    final int       delay                   = 1000 / (100 / everyTimeAdd);
    final Runnable  mUpdateProgressJumpy = new Runnable() {

            @Override
            public void run()
            {
                percentJumpy += everyTimeAdd;

                if (percentJumpy > PERCENT_TOTAL)
                {
                    mHandler.removeCallbacks(mUpdateProgressJumpy);
                }
                else
                {
                    Message msg = mHandler.obtainMessage();
                    msg.arg1 = percentJumpy;
                    msg.what = What.JUMPY;
                    mHandler.sendMessageDelayed(msg, delay);
                }
            }
        };

    @Override
    public void onClick(View v)
    {
        switch (v.getId())
        {
            case R.id.button_fluency:
                percentFluency = 0;
                mProgressFluency.setVisibility(View.VISIBLE);
                mHandler.post(mUpdateProgressFluency);
                break;
            case R.id.button_jumpy:
                percentJumpy = 0;
                mProgressJumpy.setVisibility(View.VISIBLE);
                mHandler.post(mUpdateProgressJumpy);
                break;
            case R.id.button_reset:
                mHandler.removeCallbacks(mUpdateProgressFluency);
                mProgressFluency.setProgress(0);

                mHandler.removeCallbacks(mUpdateProgressJumpy);
                mProgressJumpy.setProgress(0);
                break;
            case R.id.button_syn_increase:
                percentFluency = 0;
                mProgressFluency.setVisibility(View.VISIBLE);
                mHandler.post(mUpdateProgressFluency);

                percentJumpy = 0;
                mProgressJumpy.setVisibility(View.VISIBLE);
                mHandler.postDelayed(mUpdateProgressJumpy, delay);
                break;
            default:
                break;
        }
    }
}

布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="cn.wps.progress.MainActivity" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <ProgressBar
            android:id="@+id/progressBar1"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1" />

        <Button
            android:id="@+id/button_fluency"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="3"
            android:text="逐步增加" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <ProgressBar
            android:id="@+id/progressBar2"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="match_parent"
            android:layout_weight="1"
            android:layout_height="wrap_content" />

        <Button
            android:id="@+id/button_jumpy"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="3"
            android:text="跳跃增加" />
    </LinearLayout>

    <Button
        android:id="@+id/button_syn_increase"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="同时增加" />

    <Button
        android:id="@+id/button_reset"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="重置" />

</LinearLayout>
时间: 2024-09-29 02:32:05

Android Progress进度条代码,进度条刷新问题探讨的相关文章

Android学习笔记_76_Android ProgressBar 进度条

android 进度条的样式  例1:(默认样式(中等圆形))Xml代码 <ProgressBar      android:id="@+id/progressBar1"     android:layout_width="wrap_content"      android:layout_height="wrap_content"      /> 例2:(超大圆形)Xml代码 <ProgressBar      android

Android ProgressBar实现加载进度条

progressBar Android进度条组件. progressBar的关键属性: android:max="100"     最大显示进度条 android:progress="500"     第一显示进度 android:secondaryProgress="80"     第二显示进度 android:indeterminate="true"     设置是否精确显示 progressBar的关键方法: setPr

Android 自定义对话框,进度条,下拉刷新等

这个demo集合了自定义对话框,进度条,下拉刷新以及popup弹出框等.是学习了网上开源项目后,抽取集合了常用对话框,进度条,下拉刷新以及popup弹出框等.现在结构目录简单,更易于学习和扩展使用.注释都卸载代码.下面进行简单的介绍以及部分代码展示. 本文demo下载:点击 1.整体实现的效果图 2.项目结构图 这上面项目结构图也是一目了然,有什么功能展示.大家也看到了,这上面类有点多,如果全部贴出来,不大可能,有兴趣下载本文源码. 3.看看基础类BaseActivity 我就贴一下基础类,还有

Android 高手进阶之自定义View,自定义属性(带进度的圆形进度条)

转载请注明地址:http://blog.csdn.net/xiaanming/article/details/10298163 很多的时候,系统自带的View满足不了我们功能的需求,那么我们就需要自己来自定义一个能满足我们需求的View,自定义View我们需要先继承View,添加类的构造方法,重写父类View的一些方法,例如onDraw,为了我们自定义的View在一个项目中能够重用,有时候我们需要自定义其属性,举个很简单的例子,我在项目中的多个界面使用我自定义的View,每个界面该自定义View

Android 带进度的圆形进度条

extends:http://blog.csdn.net/xiaanming/article/details/10298163 转载请注明地址:http://blog.csdn.net/xiaanming/article/details/10298163 很多的时候,系统自带的View满足不了我们功能的需求,那么我们就需要自己来自定义一个能满足我们需求的View,自定义View我们需要先继承View,添加类的构造方法,重写父类View的一些方法,例如onDraw,为了我们自定义的View在一个项

android ProgressBar 进度条的进度两端是圆角的方法

转自 http://www.jianshu.com/p/6e7ea842d5ce 另外工作原理可以参考http://blog.csdn.net/lan603168/article/details/44705425 ProgressBar 自定义的时候可能会遇到一个问题,希望进度条中的进度的两端都是圆角的(或者进度的末端是圆角的):如下图: progress bar rounder 但是根据自定义的shape 或者是 layer-list却总是很难做到,几乎都是被clip成了直角的样子: prog

用开源项目circular progress button实现有进度条的Button

circular progress button可以让button实现进度条,效果和动画都做的很赞,只是有点小bug.需要注意的是按钮上的文字不能太大,否则会出现错位. 项目的地址:https://github.com/dmytrodanylyk/circular-progress-button 下面我们来看看怎么使用它. 一.添加依赖并在xml中放入控件 从项目地址中下载好lib后导入自己的工程,在xml中放入这样一个button <com.dd.CircularProgressButton

Android那些事儿之自定义进度条

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://winwyf.blog.51cto.com/4561999/857867 Android原生控件只有横向进度条一种,而且没法变换样式,比如原生rom的样子 很丑是吧,当伟大的产品设计要求更换前背景,甚至纵向,甚至圆弧状的,咋办,比如 ok,我们开始吧: 一)变换前背景 先来看看progressbar的属性: <ProgressBar android:id="@+id/pro

android异步任务图片下载(进度条提示进度)

一.AsyncTask介绍 Android提供了几种在其他线程中访问UI线程的方法. Activity.runOnUiThread( Runnable ) View.post( Runnable ) View.postDelayed( Runnable, long ) Hanlder 这些类或方法同样会使你的代码很复杂很难理解.然而当你需要实现一些很复杂的操作并需要频繁地更新UI时这会变得更糟糕. 为了解决这个问题,Android 1.5提供了一个工具类:AsyncTask,它使创建需要与用户界

Android View 之进度条+拖动条+星级评论条....

PS:将来的你会感谢现在奋斗的自己.... 学习内容: 1.进度条 2.拖动条 3.星级评论条 1.进度条...       进图条这东西想必大家是很熟悉的...为了使用户不会觉得应用程序死掉了,因此为之设置一个进度条使应用程序的运行状态更好的反馈给客户...这也就是进度条的作用...因此一般的应用程序都会加入进度条...进度条分为圆形进度条和线性的进度条...目的都是一样的,只是展示的效果是不同的...用代码讲解一下... <LinearLayout xmlns:android="htt