Handler消息传递机制

由于android的UI操作并不是线程安全的,android只允许UI线程修改Activity里的UI组件。UI线程就是主线程(Main Thread)。为能让新启动的线程能改变UI组件的属性,需要借助于Handler的消息传递机制。

1.Handler类

Handler类主要有两个作用:

1)在新线程里发送消息;

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

在新启动的线程里,Handler发送一个消息到Message Queue(消息队列),Looper会从消息队列中取出消息发送给Handler,交由Handler来处理消息(消息队列是先进先出的)。以下是一个实例,通过一个新线程周期性的修改ImageView所显示的图片。

public class MainActivity extends AppCompatActivity {
    private int[]images={R.drawable.f1,R.drawable.f2,R.drawable.f3,R.drawable.f4};
    private int currentImg=0;
    ImageView imageView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView=(ImageView)findViewById(R.id.image);
        final Handler myhandler=new Handler(){
            @Override
            public void handleMessage(Message msg) {
                if (msg.what==0x1233){
                    imageView.setImageResource(images[currentImg++%images.length]);
                }
            }
        };
        new Timer().schedule(new TimerTask() {
            @Override
            public void run() {
                myhandler.sendEmptyMessage(0x1233);//发送一条空信息
            }
        },0,1200);

    }
}
布局文件非常的简单,就只添加了一个ImageView控件。程序中Timer一个定时器,在定时器总调用了TimerTask对象,TimerTask对象的本质就是启动一条新线程。
2.Handler工作原理
1)Looper:每个线程只有一个Looper对象。其loop方法负责读取消息队列的消息,然后将消息发送给发送该消息的Handler。
2)Message Queue:消息队列。消息队列主要是按先进先出的方式存放消息的对象。在创建Looper对象的时候会自动绑定一个MessageQueue对象。
3)Handler:负责发送消息和处理消息。
在线程中使用Handler的过程:
1)在新创建的线程中创建一个Looper对象:Looper.prepare();在上例中主线程会默认的创建一个Looper对象。
2)创建Handler类的子类实例,重写handleMessage()方法;
3)调用Looper的loop方法启动Looper。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值