android开发中handler的各种用法实践总结

来源:互联网 发布:js url base64编码 编辑:程序博客网 时间:2024/05/18 02:00

android开发中会遇到各种各样的handler的用法,自己之前一直摸不清handler到底该怎么用,毕竟是菜鸟,只会使用简单的sendEmptyMessage(int what)这种简单用法,但是当我看到sdk中别人都在用很多复杂些的用法,这时候我就想是时候弄清楚handler的每一种用法了。其实说白了所有的发送消息的方法全部是基于mHandler.sendMessageAtTime()这个方法,可以去看一下api,这里不多说。本文不详解handler的消息发送接收机制,只讲解一下用法。

1、首先建立msg对象,不要直接new,建议使用mHandler.obtainMessage(); (也可以mHandler.obtainMessage(int what,Object obj))
注意这里你可以在obtainMessage方法中传入参数what,用来识别消息类型,当然你也可以使用msg对象去设置what,都可以的。
接着就是新建mHandler的对象了,这个就是超级简单的做法了,(下面的建立mHandler的对象都是共通的,下面的都不写了)
private Handler mHandler = new Handler() {
@Override
public void handleMessage(android.os.Message msg) {
// TO DO … 这里通过消息的what属性来识别消息类型
}
};
最后就是mHandler.sendMessage(msg);
2、连what对象都不需要建立,直接使用mHandler.obtainMessage(int what).sendToTarget();这种方法本质是msg的sendToTarget()方法,其实是调用了mHandler的sendMessage方法,
最终还是调用了mHandler.sendMessageAtTime()这个方法。

3、首先依然是建立msg对象,注意Message msg = Message.obtain(Handler h,int what,Object obj);//注意这里这个obtain方法有不同的参数,自己去看下
然后建立bundle对象,Bundle bundle = new Bundle(); bundle.putParcelable(String key,Parcelable value); msg.setData(bundle); msg.sendToTarget();
或者Message msg = Message.obtain(Handler h,int what);//msg.sendToTarget();

4、Message msg = Message.obtain(Handler h,int what,Object obj);//这里Handler这个参数可以传null
建立mCallback对象,如下:
private Handler.Callback mCallback = new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
if (msg == null) {
return false;
}
switch (msg.what) {
case …
//TO DO…
break;
}
return false;
}
};
最后发送是:mCallback.handlerMessage(msg);注意这里mCallback的回调方法handlerMessage和mHandler的回调方法不一样,这个是有boolean类型的返回值。

5、在我们平时处理的时候肯定会经常用到延时多少秒执行什么动作,这里handler也有这种用法,如下:
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//TO DO…
}
},2000);//这里2000就代表延时时间2s

6、同样的还有mHandler.obtainMessage(int what,Object obj).sendToTarget();方法发送消息,与上面的一样,只不过参数不同罢了,还有很多不同参数的,自己去看

7、
new Handler(context.getMainLooper()).post(new Runnable() {
@Override
public void run() {
//TO DO…
}
});
注意这里为了简单我直接使用了匿名对象,正常使用时不要这么搞,按照下面来写
private Handler mHandler = new Handler(Looper.getMainLooper);
mHandler.post(new Runnable(){
public void run(){
//TO DO…
}
});
8、和上面一样
private Handler mHandler = new Handler(Looper.getMainLooper,new Handler.Callback(){
public boolean handleMessage(Message msg){
//TO DO…
}
}
发送消息:mHandler.obtainMessage(int what).sendToTarget();
9、移除消息,这个就很简单了:
mHandler.removeMessage(int what);//what是消息标示
mHandler.removeCallbackAndMessages(null);// 这个代表移除所有消息,传null即可
mHandler.removeCallbacks(runnable);//移除runnable对象,因为发送消息是post一个runnable对象去执行消息,所以本质就是移除消息。
就先写到这里吧,还有很多用法没有写到,这里只写经常能用到的几种,有兴趣自己去看一下源码。

0 0