Handler内存泄露

ActivityThread-》 Looper-》MessageQueue-》Message-》Handler-》Activity

Message如果销毁了的话,就不会持有Handler引用。如果Message在队列中存活过久,就不会释放Handler,如网络请求或文件读写操作

使用静态内部类防止。因为静态内部类只持有外部类的类引用,不会持有对象。

解决方案:
1.静态内部类+弱引用【因为handler设置为静态内部类的话,就无法访问Activity的对象,因此增加对Activity的弱引用】
2. 在Activity销毁时,去清空Handler中未执行或正在执行的Callback以及Message

当你想通过一个Looper去创建多个Handler时,可以通过HandlerThread。
因为如果你想通过自己创建一个类去实现Thread(每一个Thread中只有一个Looper),没法确定创建Looper和创建Handler的前后顺序。
HandlerThread里的prepare()、getLooper()通过synchronized实现getLooper时获取Looper不为空。

多线程是为了去防止ANR(应用无响应)
AsyncTask《T,E,M》【T表示传递进去doInBackGround方法的参数,E表示更新方法的参数,M表示返回的结果的类型,doInBackGround方法最后返回的结果类型】:异步任务
为的是解决Handler的使用麻烦问题【要先继承Handler类去重写handleMessage,然后在子线程去通过sendMessage发送消息】

onPreExecute():准备工作,做一些初始化工作
doInBackGround():所有代码在子线程中进行。如果需要反馈当前进度的话,通过调用publishProgess()去完成
onProgessUpdate():当调用publishProgess(),会调用当前方法,在主线程中更新UI
onPostExecute():当后台任务结束时,就会调用此方法,接收结果,可以对UI进行操作,比如关闭对话框。

IntentService

使用IntentService的好处:
1.不用再去Service手动开线程
2.操作完成后会自动去关闭线程
3.使用起来很简单

具体使用:
1.写一个类继承IntentService,重写onHandleIntent,在这个方法做业务逻辑
2.通过startService去启动Service,然后就会去onCreate、onStartCommand、onStart、onHandleIntent【去调用业务方法】

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值