• Android Handler消息传递机制


    今天介绍一下Android的消息传递机制Handler,Handler是另一种形式的“事件处理”,这种机制主要是为了解决Android应用的多线程问题---Android平台不允许Activity新启动的线程访问该Activity里的界面组件,这样就会导致新启动的线程无法动态改变界面组件的属性值。

      Handler类主要有两个作用:

        在新启动的线程中发送消息;

        在主线程中获取、处理消息。

      Handler类包含如下方法用于发送、处理消息:

        void handlerMessage(Message msg):处理消息的方法,该方法通常用于被重写。

        final boolean hasMessage(int what):检查消息队列中是否包含what属性为指定值的消息。

        final boolean hasMessage(int what,Object object):检查消息队列中是否包含what属性为指定值且object属性为指定对象的消息。

        多个重载的Message obtainMessage():获取消息。

        sendEmptyMessage(int what):发送空消息。

        final boolean sendEmptyMessageDelayed(int what,long delayMillis):指定多少毫秒之后发送空消息。

        final boolean sendMessage(Message msg):立即发送消息。

        final boolean sendMessageDelayed(Message msg,long delayMillis):指定多少毫秒之后发送消息。

      下面看个实例,该实例通过一个新线程来周期性地修改ImageView所显示的图片,直接上代码:

     1 public class HandlerTest extends Activity
     2 {
     3     //定义周期性显示的图片的ID
     4     int[] imageIds = new int[]
     5     { 
     6         R.drawable.java,
     7         R.drawable.ee,
     8         R.drawable.ajax,
     9         R.drawable.xml,
    10         R.drawable.classic        
    11     };
    12     int currentImageId = 0;
    13     @Override
    14     public void onCreate(Bundle savedInstanceState)
    15     {
    16         super.onCreate(savedInstanceState);
    17         setContentView(R.layout.main);
    18         final ImageView show = (ImageView)findViewById(R.id.show);        
    19         final Handler myHandler = new Handler()
    20         {
    21             @Override
    22             public void handleMessage(Message msg)
    23             {
    24                 //如果该消息是本程序所发送的
    25                 if (msg.what == 0x1233)
    26                 {
    27                     //动态地修改所显示的图片
    28                     show.setImageResource(imageIds[currentImageId++]);
    29                     if (currentImageId >= 4)
    30                     {
    31                         currentImageId = 0; 
    32                     }
    33                 }
    34             }
    35         };
    36         //定义一个计时器,让该计时器周期性地执行指定任务
    37         new Timer().schedule(new TimerTask()
    38         {
    39             @Override
    40             public void run()
    41             {
    42                 //新启动的线程无法访问该Activity里的组件
    43                 //所以需要通过Handler发送信息
    44                 Message msg = new Message();
    45                 msg.what = 0x1233;
    46                 //发送消息
    47                 myHandler.sendMessage(msg);
    48             }
    49         }, 0 , 800);
    50     }
    51 }
  • 相关阅读:
    【Redis过期Key监听】
    【ElasticSearch】ES线上脏数据处理
    【MySQL】实现线上千万数据表添加字段操作以及缓存刷新
    【转】【堆外内存】堆内内存与堆外内存
    【Redis连接超时】记录线上RedisConnectionFailureException异常排查过程
    【ElasticSearch】ES 读数据,写数据与搜索数据的过程
    【ElasticSearch】shards,replica,index之间的关系
    tomorrow多线程启动
    request接口下载附件
    request接口上传附件
  • 原文地址:https://www.cnblogs.com/phj981805903/p/3295685.html
Copyright © 2020-2023  润新知