[聚合文章] 浅谈Handler

消息系统 2017-11-16 17 阅读

前言

积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得;

Handler消息传递机制

出于性能优化考虑,Android的UI操作并不是线程安全的,这意义着如果有多个线程并发操作UI组件,则可能导致线程安全问题。为了解决这个问题,Android制定了一条简单的规则:只允许UI线程修改Activity里的UI组件。在实际开发中,需要让新启动的线程周期性地改变界面组件的属性值,这就需要借助于Handler的消息传递机制来实现了。

Handler类简介

Handler类的主要作用有两个。
  • 在新启动的线程中发送消息。
  • 在主线程中获取、处理消息。
Handler类的功能看似简单,似乎只要在新启动的线程中发送消息,在主线程中获取、处理消息。但这个过程涉及两个问题:新启动的线程何时发送消息呢?主线程何时去获取并处理消息呢?
为了让主线程能在适当的时机处理新启动的线程所发送的消息,显然只能通过回调的方式来实现——需要重写Handler类中处理消息的方法。
Handler类包含如下方法用于发送、处理消息。
  • void handleMessage(Message msg):处理消息的方法。通常被重写。
  • final boolean hasMessages(int what):检查消息队列是否包含what属性为指定值的消息。
  • final boolean hasMessages(int what, Object object):检查消息队列中是否包含what属性为指定值且object属性为指定对象的消息。
  • sendEmptyMessage(int what):发送空消息。
  • final boolean sendEmptyMessageDelayed(int what,long delayMillis):指定多少秒后发送空消息。
  • final boolean sendMessage(Message msg):立即发送消息。
  • final boolean sendMessageDelayed(Message msg,long delayMillis)
本实例将通过一个新线程来周期性地修改ImageView所显示的图片,自动播放图片还可以使用ViewFlipper和AdapterViewFlipper组件来实现。

代码示例

MainActivity.java
public class MainActivity extends Activity {    // 定义周期性显示的图片ID    int[] imageIds = new int[]    {        R.drawable.baxianhua,        R.drawable.dengta,        R.drawable.juhua,        R.drawable.kaola,        R.drawable.qie,        R.drawable.shamo,        R.drawable.shuimo,        R.drawable.yujinx    };    int currentImageId = 0;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.handler);        final ImageView show = (ImageView) findViewById(R.id.image);        final Handler myHandler = new Handler()        {            @Override            public void handleMessage(Message msg) {                if(msg.what == 0x123)                {                    //动态地修改所显示的图片                    show.setImageResource(imageIds[currentImageId++ % imageIds.length]);                }            }        };        //定义一个计时器,让该计时器周期性地执行指定任务        new Timer().schedule(new TimerTask() {            @Override            public void run() {                //发送空消息                myHandler.sendEmptyMessage(0x123);            }        }, 0, 1200);//1.2秒更改一次    }
                

注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。