android中经常需要更新界面某个元素的值,但是在主线程中是不可以直接更新主线程的值。这里推荐通过handler机制来更新值。

一Handler的定义:

主要接受子线程发送的数据, 并用此数据配合主线程更新UI.
          解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 比如说, 你要是点击一个 Button, Android会分发事件到Button上,来响应你的操作。  如果此时需要一个耗时的操作,例如: 联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会收到Android系统的一个错误提示  "强制关闭".  这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,Android主线程是线程不安全的,也就是说,更新UI只能在主线程中更新,子线程中操作是危险的. 这个时候,Handler就出现了来解决这个复杂的问题,由于Handler运行在主线程中(UI线程中),它与子线程可以通过Message对象来传递数据,这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象,(里面包含数据)  , 把这些消息放入主线程队列中,配合主线程进行更新UI。

 1     ProgressBar progressBar;
 2     ProgressBar progressBar2;
 3
 4     private Handler handler1;
 5     private Handler handler=new Handler(){
 6         public void handleMessage(Message msg)
 7         {
 8             switch(msg.what)
 9             {
10             case 1:
11                 int currentProgress=progressBar.getProgress()+2;
12                 if(currentProgress>progressBar.getMax())
13                 {
14                 currentProgress=0;
15                 }
16                 progressBar.setProgress(currentProgress);
17                 break;
18             }
19         }
20     };
21     private int count;
22     private Runnable doundateProgress1 = new Runnable() {
23
24         @Override
25         public void run() {
26             // TODO Auto-generated method stub
27
28             }
29
30
31         };
32     private TimerTask timertask=new TimerTask() {
33
34         @Override
35         public void run() {
36             // TODO Auto-generated method stub
37             Message message=new Message();
38             message.what=1;
39             handler.sendMessage(message);
40         }
41     };
42
43     @Override
44     protected void onCreate(Bundle savedInstanceState) {
45         super.onCreate(savedInstanceState);
46         setContentView(R.layout.activity_main);
47         progressBar=(ProgressBar) findViewById(R.id.progressBar1);
48         progressBar2=(ProgressBar) findViewById(R.id.progressBar2);
49         Timer timer=new Timer();
50         timer.schedule(timertask, 0,1000);
51         handler1=new Handler();
52         handler1.postDelayed(new Runnable() {
53
54             @Override
55             public void run() {
56                 // TODO Auto-generated method stub
57                 for (count = 0; count <= progressBar2.getMax();count++) {
58
59                     // TODO Auto-generated method stub
60                     progressBar2.setProgress(count);
61
62
63
64             }
65             }
66         }, 10000);
67     }
68
69     @Override
70     public boolean onCreateOptionsMenu(Menu menu) {
71         // Inflate the menu; this adds items to the action bar if it is present.
72         getMenuInflater().inflate(R.menu.main, menu);
73         return true;
74     }
75
76     @Override
77     public boolean onOptionsItemSelected(MenuItem item) {
78         // Handle action bar item clicks here. The action bar will
79         // automatically handle clicks on the Home/Up button, so long
80         // as you specify a parent activity in AndroidManifest.xml.
81         int id = item.getItemId();
82         if (id == R.id.action_settings) {
83             return true;
84         }
85         return super.onOptionsItemSelected(item);
86     }

Hanlder

本例中分别通过timer和handler来更新ProgressBar的值。timer是java提供的定时器,它设置循环执行的间隔,可以设定重复执行和不重复执行。

转载于:https://www.cnblogs.com/ggz19/p/4096626.html

android Handler更新UI相关推荐

  1. android异步更新UI

    android下面图片更新是需要启动多个子线程来进行的,而android下面是并不是线程安全的,所以thread这里是用不了的,只能用runnable接口. 废话不多说了 直接上代码. 1.下载线程 ...

  2. android 观察者更新ui,android通过观察者模式实现更新UI

    /** * 观察者接口 * @author 超超boy * */ public interface Observer { void update(String str); } import java. ...

  3. Java线程更新ui_android使用多线程更新ui示例分享

    Android线程涉及的技术有:Handler;Message;MessageQueue;Looper;HandlerThread. 下面看一段在线程中更新UI的代码: public class Ma ...

  4. 85、android handler的警告Handler Class Should be Static or Leaks Occur

    转载:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1106/1922.html 在使用Handler更新UI的时候,我是这样写 ...

  5. 使用runOnUiThread更新UI

    随时随地技术实战干货,获取项目源码.学习资料,请关注源代码社区公众号(ydmsq666) android中更新UI的方式比较多,这里就不一一介绍了,比较常用的Thread+Handler,但是这种方式 ...

  6. AndroidStudio子线程更新UI的几种方式

    在安卓开发中,大部分情况下是不能在子线程直接更新UI的,只能在UI线程更新UI,其根本原因在于加入在一个Activity中有多个线程去更新UI,且没有加锁机制,可能会产生界面混乱的情况,但是如果都加锁 ...

  7. Android开发之通过Handler的post方法更新UI

    在Android中可以通过handler方法完成数据的线程间的传递,但一定要将handler得到的数据通过loop传递到主线程再更新UI吗?其实也可以直接使用handler设计的post方法进行实现, ...

  8. linux安卓主线程同步,Android解决:使用多线程和Handler同步更新UI

    如果运行时,可以看到滚动条由条慢慢变短,则说明程序成功了.截图如下,建议选择大点的文件做测试. main.xml xmlns:Android="http://schemas.android. ...

  9. android线程控制UI更新(Handler 、post()、postDelayed()、postAtTime)

    按照下面的理解就是handler与ui线程有一定的关联可以因为更新界面只能在主线程中所有更新界面的地方可以在接受消息的handleMessage那里还有更新界面可以在handler.port(new ...

最新文章

  1. 工业传感器:工业互联网的第一道门
  2. 使用PHPExcel判别和格式化Excel中的日期格式
  3. 图解sqlserver 2000 还原数据库的基本操作
  4. 【机器学习】次梯度(subgradient)方法
  5. C#遍历指定文件夹中的所有文件
  6. 新闻发布项目——实体类(categoryTB)
  7. Activiti中的安全脚本如何工作
  8. 【BZOJ4543】【POI2014】Hotel加强版(长链剖分)
  9. linux不能上网如何配置
  10. Linux中的软硬连接
  11. np.argwhere报错maximum recursion depth exceeded while calling
  12. 【JVM】GC Roots 根可达
  13. Mininet与真实网络链接的方法
  14. 加油站收银系统 Java_加油站也能用收银系统吗?
  15. nmf算法 python_推荐算法——非负矩阵分解(NMF)
  16. 曲率系列1:曲率、法曲率、平均曲率、主曲率和高斯曲率(概念推导解读)
  17. 做到这几点在家也能拍出好看的证件照
  18. .net C# asp.net SMTP 匿名发邮件完整解决方案,有源码.
  19. 协同过滤和基于内容推荐有什么区别?
  20. 树莓派CM4官方底板的双路摄像头使用

热门文章

  1. threadpoolexecutor参数_ThreadPoolExecutor的使用
  2. 降低代码执行中得内存消耗_微服务中使用 OpenJ9 JVM内存占用降低60%!
  3. HMM隐马尔科夫模型浅析
  4. 改善深层神经网络:超参数调整、正则化以及优化——2.1 Mini-batch梯度下降
  5. freertos 创建互斥量_FreeRTOS的信号量和互斥量
  6. mysql 存储过程 sql变量_SQL基础-变量 存储过程和函数
  7. CV之 HOG特征描述算子-行人检测
  8. P2872 [USACO07DEC]Building Roads S(最小生成树)
  9. loss 加权_【转载】keras 自定义 loss损失函数, sample在loss上的加权 和 metric
  10. 初学python的小技巧_Python学习小技巧总结