您的位置:首页 > 移动开发 > Android开发

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

2015-12-04 16:37 447 查看
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);

}


方法内的匿名内部类调用局部变量时,该局部变量必须是常量。此时内部类会把该常量复制一份放到内部类中,这样,方法结束时,虽然局部变量消失了,但是内部类中的常量还是可以使用的

原因参考:/article/4719054.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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: