关闭

handler学习

标签: 通信线程Handler 内存
94人阅读 评论(0) 收藏 举报

一、使用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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1810次
    • 积分:93
    • 等级:
    • 排名:千里之外
    • 原创:7篇
    • 转载:3篇
    • 译文:0篇
    • 评论:0条
    文章存档