1.handler作用:?
//2種創(chuàng)建消息方法
//1.通過handler實(shí)例獲取
Handler handler =newHandler();
Message message=handler.obtainMessage();
//2.通過Message獲取
Message message=Message.obtain();
//源碼中第一種獲取方式其實(shí)也是內(nèi)部調(diào)用了第二種:
publicfinalMessageobtainMessage(){
returnMessage.obtain(this);
}
不建議直接new Message,Message內(nèi)部保存了一個(gè)緩存的消息池,我們可以用obtain從緩存池獲得一個(gè)消息,Message使用完后系統(tǒng)會(huì)調(diào)用recycle回收,如果自己new很多Message,每次使用完后系統(tǒng)放入緩存池,會(huì)占用很多內(nèi)存的。?
//傳遞的數(shù)據(jù)
Bundle bundle =newBundle();
bundle.putString("msg","傳遞我這個(gè)消息");
//發(fā)送數(shù)據(jù)
Message message = Message.obtain();
message.setData(bundle);//message.obj=bundle? 傳值也行
message.what =0x11;
handler.sendMessage(message);
//數(shù)據(jù)的接收
finalHandler handler =newHandler() {
@Override
publicvoidhandleMessage(Message msg){
super.handleMessage(msg);
if(msg.what ==0x11) {
? ? ? ? ? ? ? ? Bundle bundle = msg.getData();
String date = bundle.getString("msg");
? ? ? ? ? ? }
? ? ? ? }
};
//創(chuàng)建handler
finalHandler handler =newHandler() {
@Override
publicvoidhandleMessage(Message msg){
super.handleMessage(msg);
if(msg.what ==0x11) {
//更新ui
? ? ? ? ? ? ? ? ? ? ? ? ? ......
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? };
newThread(newRunnable() {
@Override
publicvoidrun(){
//FIXME 這里直接更新ui是不行的
//還有其他更新ui方式,runOnUiThread()等? ? ? ? ?
message.what =0x11;
? ? ? ? ? ? ? ? handler.sendMessage(message);?
? ? ? ? ? ? }
? ? ? ? }).start();
//消息
? ? Message message = Message.obtain();
//發(fā)送消息
newHandler().sendMessage(message);
//延時(shí)1s發(fā)送消息
newHandler().sendMessageDelayed(message,1000);
//發(fā)送帶標(biāo)記的消息(內(nèi)部創(chuàng)建了message,并設(shè)置msg.what = 0x1)
newHandler().sendEmptyMessage(0x1);
//延時(shí)1s發(fā)送帶標(biāo)記的消息
newHandler().sendEmptyMessageDelayed(0x1,1000);
//延時(shí)1秒發(fā)送消息(第二個(gè)參數(shù)為:相對(duì)系統(tǒng)開機(jī)時(shí)間的絕對(duì)時(shí)間,而SystemClock.uptimeMillis()是當(dāng)前開機(jī)時(shí)間)
newHandler().sendMessageAtTime(message, SystemClock.uptimeMillis() +1000);
//避免內(nèi)存泄露的方法:
//移除標(biāo)記為0x1的消息
newHandler().removeMessages(0x1);
//移除回調(diào)的消息
newHandler().removeCallbacks(Runnable);
//移除回調(diào)和所有message
newHandler().removeCallbacksAndMessages(null);
1)handler怎么使用會(huì)產(chǎn)生內(nèi)存泄露?
publicclassMainActivityextendsAppCompatActivity{
finalHandler handler =newHandler() {
@Override
publicvoidhandleMessage(Message msg){
super.handleMessage(msg);
? ? ? ? ? ? ? ? ......
? ? ? ? }
? ? };
@Override
protectedvoidonCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
? ? ? ? setContentView(R.layout.activity_main);
//activity被執(zhí)行時(shí),被延遲的這個(gè)消息存于主線程消息隊(duì)列中1分鐘,
//此消息包含handler引用,而handler由匿名內(nèi)部類創(chuàng)建,持有activity引用,
//activity便不能正常銷毀,從而泄露
handler.postDelayed(newRunnable() {
@Override
publicvoidrun(){
? ? ? ? ? ? ? ? ......
? ? ? ? ? ? }
},1000*60);
? ? }
}
publicclassMainActivityextendsAppCompatActivity{
//創(chuàng)建靜態(tài)內(nèi)部類
privatestaticclassMyHandlerextendsHandler{
//持有弱引用MainActivity,GC回收時(shí)會(huì)被回收掉.
privatefinalWeakReference mAct;
publicMyHandler(MainActivity mainActivity){
mAct =newWeakReference(mainActivity);
? ? ? ? }
@Override
publicvoidhandleMessage(Message msg){
? ? ? ? ? ? MainActivity mainAct=mAct.get();
super.handleMessage(msg);
if(mainAct!=null){
//執(zhí)行業(yè)務(wù)邏輯
? ? ? ? ? ? }
? ? ? ? }
? ? }
privatestaticfinalRunnable myRunnable =newRunnable() {
@Override
publicvoidrun(){
//執(zhí)行我們的業(yè)務(wù)邏輯
? ? ? ? }
? ? };
@Override
protectedvoidonCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
? ? ? ? setContentView(R.layout.activity_main);
MyHandler myHandler=newMyHandler(this);
//延遲5分鐘后發(fā)送
myHandler.postDelayed(myRunnable,1000*60*5);
? ? }
}
a)Handler.post(Runnable)其實(shí)就是生成一個(gè)what為0的Message,調(diào)用
myHandler.removeMessages(0);
會(huì)使runnable任務(wù)從消息隊(duì)列中清除。