zoukankan      html  css  js  c++  java
  • Android开发之使用Handler刷新UI控件

    一、为什么必须使用Handler

    1. 线程安全问题

            这个问题要理解的话很容易,如果没有这个约束,那么同时有两个线程对一个UI控件进行调整,
      那么控件自然就没法正常的工作,而为了解决这种二义性(就是一个东西同时被多个使用者使用,
      从而无法判断按哪个使用者来调整)。而Handler永远都是在UI主线程,这就意味着对一个控件的修
      改永远只会有一个线程,不会存在多个线程同时修改一个控件。

    2. 统一管理

            通过Handler可以统一进行对UI的管理,因为Handler采用消息处理的机制。简单理解就是另
      一个线程发送一个编号给消息所在的线程,那么该线程的消息处理程序就会收到该消息并进行处理,
      而消息采用int类型,所以int能够表示多少种数字就以为着有多少消息可以给你使用(因为存在系统
      的消息,所以可能有一部分被系统的消息占有,而不能使用)。

    二、Handler介绍

    1. handleMessage(Message msg)

         需要重写的方法,该方法为处理消息的核心函数。

    2. sendEmptyMessage(int what)

         发送指定的消息,该方法为仅仅只是传递一个int值来表示发送的消息类型。

    三、重写handleMessage(Message msg)

    1 Handler handler = new Handler(){
    2           @Override
    3           public void handleMessage(Message msg){
    4                    //获得通过handler.sendEmptyMessage发送的消息编码
    5                    int what = msg.what;
    6                    /* 处理代码 */
    7           }
    8 }

    四、使用handler发送消息

    1 handler.sendEmptyMessage(0x101);

    五、实例

    1. 新建一个线程来给主线程发送消息
       1 public class MainActivity extends Activity{
       2        private static final int send_msg_code =  0x101;
       3        
       4        Handler handler = new Handler(){
       5             @Override
       6             public void handleMessage(Message msg){
       7                     int what = msg.what;
       8                     if(what == send_msg_code){
       9                             Toast.makeText(MainActivity.this,"成功",Toast.LENGTH_SHORT).show();
      10                     }
      11             }
      12        }       
      13 
      14        @Override
      15        protected void onCreate(Bundle savedInstanceState)
      16        {
      17                 new Thread(new Runnable(){
      18                           handler.sendEmptyMessage(send_msg_code);
      19                 }).start();
      20        }
      21 }

    六、扩展

    1. post(Runnable r)

         将r加入到消息队列中(其实就是利用UI主线程执行一段代码,这样可以随时在其他线程中调整控件)

    2. postDelayed(Runnabled r,long delayMillis)

         将r加入到消息队列中,并在指定时间之后触发(单位为毫秒)

    3. removeMessages(int what)

         取消消息的发送

    4. sendMessages(Message msg)

        通过Message发送消息(这样可以将数据包装进去,一起发送过去)
  • 相关阅读:
    杂记 后台代码取DataSource中的值,和不间断滚动JS
    利用IHttpModule实现URL地址转发功能
    在ASP.NET中跟踪和恢复大文件下载
    小记,取GB2312汉字的首字母
    小记,提供文件下载,并控制下载速度
    黑客知识系列之木马程序隐身的技术
    经典算法C#四种排序算法
    跟我学做c#皮肤美化(六)
    【转】xPath语法介绍
    一个httpwebrequest异步下载的例子
  • 原文地址:https://www.cnblogs.com/yaozhenfa/p/np_android_Handler.html
Copyright © 2011-2022 走看看