如何正确自定义handler
来源:互联网 发布:淘宝部分店铺无法使用 编辑:程序博客网 时间:2024/04/30 16:54
来自DeskClock/src/com/android/deskclock/alarms/starclock/ui/BaseMediaListActivity.java的源码
问1、为什么是静态 2、为什么使用WeakReference保存一遍activity。
54 private static class InnerHandler extends Handler {
55 private final WeakReference<BaseMediaListActivity> mActivity;56
57 public InnerHandler(BaseMediaListActivity activity) {
58 this.mActivity = new WeakReference<BaseMediaListActivity>(activity);
59 }
60
61 @Override
62 public void handleMessage(Message msg) {
63 BaseMediaListActivity activity = mActivity.get();
64 if (activity == null) {
65 LogUtils.d("WeakReference of BaseMediaListActivity already has recycled.");
66 return;
67 }
68
69 switch (msg.what) {
70 case BaseMediaListActivity.MSG_REQUEST_DATA_REQUEST:
71 activity.onStarRequest();
72 break;
73 case BaseMediaListActivity.MSG_REQUEST_DATA_SUCCESS:
74 activity.onRequestSuccess((String) msg.obj);
75 break;
76 case BaseMediaListActivity.MSG_REQUEST_DATA_FAILED:
77 activity.onRequestFailed(msg.arg1, (Throwable) msg.obj);
78 break;
79 default:
80 throw new IllegalArgumentException("Invalid message type: " + msg.what);
81 }
82 }83 }
答1:因为使用了外部的静态变量,只能将handler定义为静态内部类,非静态内部类访问不到静态变量。
答2:如果不写构造函数,编译器解析内部类代码时,自动添加了够函数,传入外部类的对象,内部类一直支持外部类activity,容易引起内存溢出。
所以自定义handler时,应该着重注意,避免内部类直接,持有外部类对象,应该使用若引用方式持有。
如果handler中的looper也是自定义,问题2更容易引起内存泄漏。
所以在不使用loopr的时候主动退出。因为如果不主动退出looper,looper会一直存在。
如果反复创建,还会引起创建线程溢出。因为new HandlerThread("downloadImage");时,最终是在native层创建线程,
使用select,管理线程描述符,最大只能创建1024个(bionic/libc/include/sys/select.h 中有定义)
正确使用:
650 private class SubThreadHandler extends Handler {
651 这里没有需要弱引用和静态的必要
652
653 public SubThreadHandler(Looper looper) {
654 super(looper);
655 }
656
657 public void handleMessage(Message msg) {
658
659 switch (msg.what) {
663 if (null != mHandlerThread) {
664 boolean quit = mHandlerThread.quitSafely();
665 LemeLog.printI(TAG, "mHandlerThread quit: " + quit);
666 }
667 break;
668 }
669 }
670 }
158 mHandlerThread = new HandlerThread("my");
160 mHandlerThread.start();
161 mSubThreadHandler = new SubThreadHandler(mHandlerThread.getLooper());
- 如何正确自定义handler
- Handler的正确写法
- Handler的正确使用
- 正确使用Handler
- 如何正确的使用Handler,带你从源码上认识!
- Android Handler正确使用姿势
- 在自定义类中如何正确输出自定义类的属性值 objective-c的description
- handler自定义使用
- handler自定义使用
- solr 自定义Handler
- 解决Handler黄色警告,Handler正确使用方式
- Handler的正确使用,软引用封装
- Handler的正确使用,防止内存泄漏
- Android 消息传递Handler的正确用法
- 如何正确的为web.config编写http error code的自定义页面
- 如何使用Handler?
- Android如何使用Handler
- 如何使用Handler
- 使用Flask-Mail扩展发送邮件
- 注意pointcut的入参的表达式名称
- tomcat设置get方法中url的长度限制
- android 图片压缩算法
- R-FCN+ResNet-50 训练模型
- 如何正确自定义handler
- python下运行import sklearn.model_selection 出错ImportError: No module named model_selection解决方法
- java基础学习API之StringBuffer类 六-2
- PLSQL DDL Trigger save DDL history
- Android调试系列之开发者选项常用功能
- 问题:在兼容IE7的情况下画线、画图,减少锯齿
- Weblogic 安装和配置SSL(Linux)
- Python random 通用格式
- JavaScript学习系列之深入原型链与继承的实现