android学习笔记(七):Handler消息传递机制

本文通过一个具体的Android图片轮播示例介绍了如何利用Handler实现线程间的消息传递及更新UI,详细解析了Handler、Looper与MessageQueue的工作原理。

1、先举个例子:
图片定时轮播
MainActivity.java:

package com.example.weixin;

import java.util.Timer;
import java.util.TimerTask;

import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageView;

public class MainActivity extends ActionBarActivity {

    int[] drawable = new int[]{
            R.drawable.a,
            R.drawable.b,
            R.drawable.c
        };
    int i = 0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final ImageView imageView = (ImageView)findViewById(R.id.view);
        final Handler handler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                // TODO Auto-generated method stub
                if(msg.what == 0x110)
                {

                    imageView.setImageResource(drawable[i++%drawable.length]);
                }
            }
        };
        new Timer().schedule(new TimerTask() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                handler.sendEmptyMessage(0x110);
            }
        },0,1200);

    }

  • 方法内的匿名内部类调用局部变量时,该局部变量必须是常量。此时内部类会把该常量复制一份放到内部类中,这样,方法结束时,虽然局部变量消失了,但是内部类中的常量还是可以使用的
    原因参考:http://www.cnblogs.com/dolphin0520/p/3811445.html

  • 图片资源的名字不能是数字,否则出错

  • 只有UI线程能处理与UI相关的事件,其他线程不能处理,这样就用到了handler消息处理机制
    这里写图片描述

2、Looper、Handler、MessageQueue的作用:
- Looper:每个线程只有一个Looper,它负责管理MessageQueue,会不断地从MessageQueue中取出消息,并将消息分给对应的Handler处理
- MessageQueue:有Looper负责管理,它采用先进先出的方式来管理Message
- Handler:它能把消息发送给MessageQueue,并负责处理Looper分给它的消息
3、 在线程中使用Handler的步骤如下:
- 调用Looper的prepare()方法为当前线程创建Looper对象,创建对象时,它的构造器会创建与之配套的MessageQueue
- 有了Looper后,创建Handler的实例,重写handleMessage()方法,该方法负责处理来自于其他线程的消息
- 调用Looper的loop()方法,启动Looper

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值