ProgressBar 为什么可以在非UI线程中更新进度。
2016-04-17 12:31
621 查看
最近在网上看到一个面试题,要求如下:
页面上现有ProgressBar控件progressBar,请用书写线程以10秒的的时间完成其进度显示工作。
看到这段代码的时候在想,是不是写错了!怎么可以在非UI线程中更新ProgressBar 的进度呢?后来,看了 ProgressBar.java 源码才明白。
先看setProgress(int progress)方法的实现
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/06/814910dc22ffff6c254e540a50b14b3f)
refreshProgress()方法的实现
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/06/39cd922c7a9f737cdbd82ebaa0b3a179)
在这里我们可以看到,
(1)先判断是否是UI线程,是的话就直接执行doRefreshProgress()方法来更新 ProgressBar。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/06/eca65ba160d277bfa49be374f8511b37)
(2)否则创建一个RefreshProgressRunnable对象,然后添加到View的消息队列中也就是post(mRefreshProgressRunnable),说白就是用handler来更新UI。以下是源码的展示。
RefreshProgressRunnable的实现
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/06/231739598e5c8cac66d0dbea9664b133)
View.post(Runable)的实现
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/06/cbb015a733d7307349ebbb143dba97ea)
如果有描述不清楚的话,大家可以看看ProgressBar.java源码的实现。
页面上现有ProgressBar控件progressBar,请用书写线程以10秒的的时间完成其进度显示工作。
package com.jiao; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.ProgressBar; public class MainActivity extends AppCompatActivity { private ProgressBar mProgressBar; private Button mStartBtn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mProgressBar = (ProgressBar) findViewById(R.id.progress); mStartBtn = (Button) findViewById(R.id.start); mStartBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { doProgress(); } }); } public void doProgress(){ new Thread(new Runnable() { @Override public void run() { try { int progressMax = mProgressBar.getMax(); while(progressMax != mProgressBar.getProgress()){ int step = progressMax / 10; mProgressBar.setProgress(mProgressBar.getProgress() + step); Thread.sleep(1000); } } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } }
看到这段代码的时候在想,是不是写错了!怎么可以在非UI线程中更新ProgressBar 的进度呢?后来,看了 ProgressBar.java 源码才明白。
先看setProgress(int progress)方法的实现
refreshProgress()方法的实现
在这里我们可以看到,
(1)先判断是否是UI线程,是的话就直接执行doRefreshProgress()方法来更新 ProgressBar。
(2)否则创建一个RefreshProgressRunnable对象,然后添加到View的消息队列中也就是post(mRefreshProgressRunnable),说白就是用handler来更新UI。以下是源码的展示。
RefreshProgressRunnable的实现
View.post(Runable)的实现
如果有描述不清楚的话,大家可以看看ProgressBar.java源码的实现。
相关文章推荐
- 为什么说Druid是“最好的数据库连接池”?体现在哪些方面?这是如何实现的? (mybatis是不自带jdbc链接池的)
- Arduino中的数据类型
- django-1366, "Incorrect string value: '\\xE6\\x88\\x9A\\xE4\\xBC\\x9F...'
- django-1366, "Incorrect string value: '\\xE6\\x88\\x9A\\xE4\\xBC\\x9F...'
- 斐波那契数列 Fibonacci sequence
- 安装VBox共享文件增强功能VBoxGuestAdditions
- MySQL: table、view、trigger、procedure、index (表、主键、UNIQUE Key、列、索引、视图、触发器、存储过程)查看、修改、更新、删除操作
- 使用fuel6.0自动安装openstack-juno版本(2)
- iOS蓝牙4.0(BLE)-LightBlue与cc2540开发板通信
- HDU5667 sequence 递推求值 (矩阵快速幂)
- [HDU 5667] Sequence (矩阵快速幂+费马小定理)
- HDU 5667 Sequence 矩阵快速幂
- java 集合-ArrayDeque
- java.sql.SQLException: Value'0000-00-00'错误解决方法
- 太阳神三国杀源代码 HOW TO BUILD
- Zero Requiem
- HDU 5667 Sequence(矩阵快速幂)
- HDU 5667 Sequence(矩阵快速幂)
- 第二次聊一聊JS require.js模块化工具的基础知识
- Android_UI:drawable文件夹下 创建XML