Handler概述
Android启动后会建立一个主线程(UI线程),主线程主管UI控件和事件的分发。如果一个比较耗时的操作在主线程中处理会造成UI阻塞,此时我们
应将耗时或消耗资源的操作放在子线程中进行。子线程通常要操作UI,而UI线程是不安全的只能在主线程中进行,所以子线程应将Message传
递到主线程中,在主线程中完成UI更新。Handler的线程间通信功能理想的选择。
Handler只能接受自身实例所发送的Message。
Handler的作用
执行计划任务。例如模拟定时器
线程间通信。当Android程序启动时会创建一个主线程(UI线程),主线程会默认建立消息队列来处理各种消息(子线程不会默认),当在子线程中得
到主线程的Handler实例时,就可以call Handler的sendMessage()方法向主线程发送消息,完成子线程向主线程的单向通信。Handler的本质
是解决线程间通信问题,所以通过Handler以及Handler管理下的Looper、Message、MessageQueue对象方法可实现线程间消息的互传递。
分发Message对象或者Runable对象到其他线程
安排一个动作道不同的线程执行
Handler的实现原理
//Handler
//实现了Handler.Callback接口,重写了handlerMessage()方法。
new Handler(); new Handler(Looper looper);
boolean post(Runable r);将r线程中的消息发送到目标消息队列中
boolean sendMessage(Message msg);
Message obainMessage();
Message obainMessage(int what);
Looper getLooper();
String getMessageName(Message msg);
//Message 消息体含有发送者Handler的what标记,所以handler只能接收自己所发送的消息
new Message();
void setData(Bundle bundle);
Bundle getData();
static Message obain();
static Message obain(Handler h);
//Bundle
new Bundle();
void putType("key",Type value);
Type getType("key");
//MessageQueue 由系统实现,用以维护消息的机制,开发人员是不用考虑MessageQueue的。
//Looper
static void prepare();//为当前线程初始化一个Looper
static void loop();//启动Looper
static Looper getMainLooper() ;//获取主线程Looper
void quit();
static Looper myLooper();获得当前线程相关的Looper
Thread getThread();获得与Looper相关的线程
//HandlerThread
// 继承自Thread,为开启的线程创建默认的MessageQueue,是拥有Looper特性的线程,
new HandlerThread(Stirng name); new HandlerThread(String name,int priority);//priority线程优先权
Looper getLooper();
void onLooperPrepared();
Handler与线程间的关系
Handler是多线程的应用吗?
是的
Handler消息队列的实现
Handler是异步的,它会建立线程吗?
Handler是由vm控制的系统底层的实现,或许是由底层线程维护,但并没有在我们的应用层建立新的线程
Handler是在主线程内吗?
不一定,看你创建Handler的位置。
Handler的post(Runable thread)和sendMessage(Message msg)方法使用的是一个队列吗?
是的。post() Method 其实质是调用传入的线程的消息发送Method。
在子线程中建立一个Handler,然后call sendMessage()方法会怎样?
子线程默认是没有消息队列的,在子线程中实例化Handler并call sendMessage()方法会throw exception,所以在子线程中要实例化Looper,
并call loop方法来启动looper监听消息。
在子线程中建立Handler,构造时传入主线程的Looper可以吗?
可以。
Handler的应用:handler的应用应抓一个解释两点本质
解释:当某线程中的Looper监听到某线程的Handler发送的Message时,就会触发该Handler的handleMessage()
method.
本质:1、获取某一线程Handler对象 2、获取某一线程Looper对象并启动Looper
子线程中获取主线程中创建的Handler,并操作主线程MessageQueue,向主线程发送消息。主线程中创建的Handler默认绑定到主线程中的Looper。
//创建Handler子类
class MyThreadHandler extends Handler
{
public void handleMessage(Message msg)
{
super.handleMessage(Message msg);
//your code here;
}
}
//消息体生成方法
provite Message defineMessage(String msgString)
{
Message msg=new Message();
Bundle bundle=new Bundle();
bundle.putString("MSG",msgString);
msg.setData(bundle);
return msg;
}
}
//创建Activity
public class MyActivity extends Activity
{
Button button=null;
MyThreadHandler handler=null;
protected void onCreate(Bundle saveInstanceState)
{
super.onCreate(savaInstanceState);
setContentView(R.layout.myLayout);
handler=new MyThreadHandler();
button1=(Button)findViewById(R.id.button);
button1.setOnClickListener(new OnClickListener(
public void onClick(View v)
{
//新建线程,发送消息
new Thread(new Runable(){
public void run()
{
handler.sendMessage(defineMessage("我的消息"));
}
}).start();
}
));
}
在子线程中创建Handler,并通过Looper.getMainLooper()传入主线程的Looper,向主线程的Looper发送Message。
//创建Handler子类
class MyThreadHandler extends Handler
{
public void handleMessage(Message msg)
{
super.handleMessage(Message msg);
//your code here;
}
}
//消息体生成方法
provite Message defineMessage(String msgString)
{
Message msg=new Message();
Bundle bundle=new Bundle();
bundle.putString("MSG",msgString);
msg.setData(bundle);
return msg;
}
}
//创建Activity
public class MyActivity extends Activity
{
Button button=null;
protected void onCreate(Bundle saveInstanceState)
{
super.onCreate(savaInstanceState);
setContentView(R.layout.myLayout);
button=(Button)findViewById(R.id.button);
button.setOnClickListener(new OnClickListener(
public void onClick(View v)
{
//新建线程,发送消息
new Thread(new Runable(){
//在子线程中创建Handler
public void run()
{
ThreadHandler handler=new MyThreadHandler(Looper.getMainLooper());
handler.sendMessage(defineMessage("我的消息"));
}
}).start();
}
));
}
通过HandlerThread创建带有默认Looper的子线程
//创建Handler子类
class MyThreadHandler extends Handler
{
public void handleMessage(Message msg)
{
super.handleMessage(Message msg);
//your code here;
}
}
//消息体生成方法
provite Message defineMessage(String msgString)
{
Message msg=new Message();
Bundle bundle=new Bundle();
bundle.putString("MSG",msgString);
msg.setData(bundle);
return msg;
}
}
//创建HandlerThread子类
public MyHandlerThread extends HandlerThread()
{
public MyHandlerThread(String name)
{super.(name);}
public void run()
{
Looper looper=this.getLooper();
MyHandler handler=new MyHandler(looper);
handler.sendMessage("MSG","我的消息");
}
}
//创建Activity
public class MyActivity extends Activity
{
Button button=null;
protected void onCreate(Bundle saveInstanceState)
{
super.onCreate(savaInstanceState);
setContentView(R.layout.myLayout);
button=(Button)findViewById(R.id.button);
button.setOnClickListener(new OnClickListener(
public void onClick(View v)
{
//新建线程,发送消息
new MyHandlerThread(String myHandlerThread).start();
}
));
}
在子线程中创建Handler和Looper,发送消息自接收
//创建Handler子类
class MyThreadHandler extends Handler
{
public void handleMessage(Message msg)
{
super.handleMessage(Message msg);
//your code here;
}
}
//消息体生成方法
provite Message defineMessage(String msgString)
{
Message msg=new Message();
Bundle bundle=new Bundle();
bundle.putString("MSG",msgString);
msg.setData(bundle);
return msg;
}
}
//创建Activity
public class MyActivity extends Activity
{
Button button=null;
protected void onCreate(Bundle saveInstanceState)
{
super.onCreate(savaInstanceState);
setContentView(R.layout.myLayout);
button=(Button)findViewById(R.id.button);
button.setOnClickListener(new OnClickListener(
public void onClick(View v)
{
//新建线程,发送消息
new Thread(new Runable(){
//在子线程中创建Handler
public void run()
{
Looper.prepare();//为当前线程初始化Looper
ThreadHandler handler=new MyThreadHandler();
handler.sendMessage(defineMessage("我的消息"));
Looper.loop();//启动Looper监听方法
}
}).start();
}
));
}