关于HandlerThread类的学习心得

来源:互联网 发布:mysql数据库篡改 黑客 编辑:程序博客网 时间:2024/05/29 04:55

http://blog.csdn.net/qq_27258799/article/details/50854175

这篇帖子讲过Looper、Handler之间的关系,也说过Looper的加入,可以是一个线程升级为Looper线程,可以持续接收消息并执行一些事务,比如可以用来做图库,显示手机照片。

Looper线程的升级,使用方法大概是这样:

public class MyThread extends Thread{  private static final String TAG = "MyThread";  private Handler mHandler;  public MyThread(String name){    super(name);  }  public Handler getHandler(){    return mHandler;  }  @Override  public void run(){    Looper.prepare;//把Looper绑定到此线程    mHandler = new Handler(){      @Override       public void handleMessage(Message msg){        switch(msg.what){          //处理消息        }      }       };    Looper.loop();//不要忘了调用loop()启动消息循环    //只有循环停止了,Looper才会返回  }}
到此为止,一个Looper线程就诞生了,然后我们就可以发送Runnable对象或者消息,开始任务了。

MyThread thread = new MyThread("looper thread");thread.start();//过一会儿Handler handler = thread.getHandler();//小心:如果处理程序尚未初始化,会返回null!//发送Runnable对象handler.post(new Runnable(){  public void run(){    //处理一些事情  }});//发送消息int what = 0;int arg1 = 1;int arg2 = 2;Message msg = Message.obtain(handler, what, arg1, arg2);//还记得要用这种方法产生Message对象吧handler.sendMessage;

值得一提的是,Handler对象在run()方法中创建,因为它需要被绑定到指定的Looper,这个Looper就是在run()方法中调用Looper.prepare()创建的。因此在线程之前,调用getHandler()将会返回null。但是问题是,尽管线程已经启动,getHandler()也可能返回null,而且上述升级Looper线程的过程略微繁琐,这个时候HandlerThread就可以派上用场了。

上述例子可以改为这样:

public class MyHandlerThread extends HandlerThread(){  private static final String TAG = "MyThread";  private Handler mHandler;  public MyThread(String name){    super(name);  }  public Handler getHandler(){    return mHandler;  }  @Override  public void start(){    super.start();    Looper looper = getlooper();    mHandler = new Handler(looper){      @Override       public void handleMessage(Message msg){        switch(msg.what){          //处理消息        }      }       };  }}
这种情况下,只要MyHandlerThread.start()执行以后,就可以用getHandler()获取Handler对象了,不会出现竞争状态。

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 上海租房人放2个麻将台怎么办 南宁公租房住满5年后怎么办 合伙买房时如果出售意见不合怎么办 老旧小区改造下水一楼不同意怎么办 老旧小区下水改造没改怎么办 替公司租房子中介不退押金怎么办 想在昆山找合租房的该怎么办 链家二手房价钱买贵了怎么办 拿私人房产证抵押借钱不还怎么办 在借贷宝里借钱不还怎么办 出租屋的大门感应钥匙弄丢了怎么办 法院拍卖的房子房主不配合怎么办 租的房子如果房主卖了怎么办 房东把门锁换了里面的东西怎么办 房租没到期房东把门锁换了怎么办 租了三年店面房东违反了合同怎么办 学生登录教务系统的密码忘记怎么办 铜陵无牌助力车被交警查到怎么办 福州超标电动车被交警抓到怎么办 单位自管公租房承租人去世怎么办 取得房产证后贷款批不下来怎么办 租店面遇到难搞的房东怎么办 在拆违通知书上签字了该怎么办 单位没交公职金的退休后怎么办 公租房合同到期后没有续签怎么办 租房合同没到期不想租了怎么办 租的房子是人家公租房怎么办 五险合一软件口令忘记了怎么办 计生办把婚育状况登记错了怎么办? 医院发票法院要保险也要怎么办 上海社保里生育险暂停参保怎么办? 痔疮手术后大姨妈来了怎么办 微创痔疮术后第五天涨出血怎么办? 肚子胀疼大便拉不出来怎么办 得痔疮了该怎么办昆明东大治 下体痒还没去检查就来月经了怎么办 直肠造口手术后造口肠子突出怎么办 痔疮pph手术瘢痕两年了该怎么办 肛瘘挂线术后六天腹泻了怎么办 刚满月的孩子鼻子不通气怎么办 齐鲁医院挂的号晚了怎么办