handler学习

一、使用handler的主要目的
handle主要是为了解决线程间通信问题
二、工作过程
    Handler 先进先出原则。
  1、Looper: 一个线程可以产生一个Looper对象(也只能一个),由它来管理此线程里的Message Queue(消息队列)。
主线程会自动创建 Looper并执行  具体可以看ActivityThread
public static void main(String[] args) {  
Looper.prepareMainLooper();    
ActivityThread thread = new ActivityThread();    
thread.attach(false); 
Looper.loop();    
 throw new RuntimeException("Main thread loop unexpectedly exited");
}


  2、Handler: 可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper从Message Queue取出)所送来        的消息。
  3、Message Queue(消息队列):用来存放线程放入的消息。 
        4、Message 消息
  5、线程:UI thread就是main thread,而Android启动程序时会替它建立一个Message Queue。




三、发送消息
     2种生成消息的方式  
     Message message = Message.obtain(); //获取消息池里的消息   节省资源  推荐
     Message message = new Message();     //自己创建            耗资源    不推荐


    用handle执行Runnable
    post(Runnable)                   
    postAtTime(Runnable,long)
    postDelayed(Runnable long)
    
    发送消息
    sendEmptyMessage(int what)
    sendMessage(Message)
    sendMessageAtTime(Message,long)
    sendMessageDelayed(Message,long)


四、内存泄漏
原因:内部类持有外部类的引用
解决办法
 将Handler声明为静态类(静态类不持有外部类的对象)
 弱引用外部类对象
 关闭Activity时把消息清空


 列子:
 private static class MyHandler extends Handler {
WeakReference<LegendSettingUpdateActivity> mWeakReference;
public MyHandler(LegendSettingUpdateActivity activity) {
mWeakReference = new WeakReference<LegendSettingUpdateActivity>(activity);
}

@Override
public void handleMessage(Message msg) {
final LegendSettingUpdateActivity activity = mWeakReference.get();
if (activity != null) {
if (msg.what == 1) {
Intent mIntent = new Intent();
mIntent.putExtra("value", endvalue);
activity.setResult(0, mIntent);
activity.finish();

}

if (msg.what == 2) {

pDailog.dismiss();
Toast.makeText(activity, "区间值不合理,请检查", Toast.LENGTH_SHORT).show();
} else {
activity.finish();
}
}
}
}



@Override
protected void onDestroy() {
super.onDestroy();
if (pDailog != null && pDailog.isShowing()) {
pDailog.cancel();
}
mHandler.removeCallbacksAndMessages(null);    //清空消息
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值