
获得徽章 17
- WeakHashMap在一定程度上可以帮助避免因强引用导致的内存泄漏,但并不能完全保证,因为它依赖于垃圾回收机制,且其清理过程是延迟的。
详细解释:
WeakHashMap的优势:
弱键回收:WeakHashMap的key是弱引用,当key不再被其他强引用所持有时,key会被垃圾回收器回收,从而释放value所占用的内存。
避免因监听器/回调函数导致的内存泄漏:例如,全局监听器或回调函数可能持有Activity的强引用,导致Activity无法被回收,使用WeakHashMap可以解决这个问题。
WeakHashMap的局限性:
延迟清理:WeakHashMap的清理过程是延迟的,即key被回收后,value并不会立即被移除,而是等到下次访问或操作时才会被清理。
无法完全避免内存泄漏:如果value本身持有大量的内存,即使key被回收,value也可能导致内存泄漏。
需要配合其他机制:为了更好地避免内存泄漏,需要结合其他机制,例如使用WeakReference和HashMap的组合,或者合理地清理WeakHashMap中的数据。
总结:
WeakHashMap可以有效避免因强引用导致的内存泄漏,但不能保证完全避免内存泄漏。
需要根据具体场景,选择合适的内存管理策略,例如使用WeakHashMap、WeakReference,或者合理地清理数据。展开赞过评论2 - jarsigner -verbose -keystore [您的证书存放路径] -signedjar [签名后文件存放路径] [未签名的文件路径] [您的证书名称]赞过评论1
- #每天一个知识点# 线程池的好处是减少线程创建和销毁上所花费的时间及系统资源的开销,解决资源不足的问题。在 Android 开发中同样也会经常使用到线程池。主要利用 Executors工厂类提供的方法:
● newCachedThreadPool: 只有非核心线程,最大线程数非常大,如果线程池中的线程都活动时,有新任务会创建新线程,否则会利用空闲线程,线程空闲时间为60秒,超过60秒会被回收。
适合大量的耗时少的任务。
● newFlxedThreadPool: 只有核心线程,并且数量固定,队列没有限制,如果线程池中的所有线程都活动时,新任务加入队列等待执行,空闲线程不回被释放,还会占用一定的系统资源。
更快的相应外界请求。
● newScheduledThreadPool: 核心线程数固定,非核心线程没有限制,空闲时会直接被回收。
适合执行定时任务及固定周期的重复任务
● newSingleThreadExecutor: 只有一个核心线程,确保所有任务都在同一线程中按顺序完成。展开赞过评论1 - #每天一个知识点# Android 事件分发的顺序:Activity -> ViewGroup -> View。主要涉及到 dispatchTouchEvent() 、onInterceptTouchEvent() 和 onTouchEvent()三种接口来实现。
dispatchTouchEvent 方法分为两部分:子 View 的 dispatchTouchEvent 或 onTouch方法和自身的 onTouchEvent 方法。onInterceptTouchEvent() 方法返回 true,则会将事件拦截掉,就给自身的 onTouchEvent处理。如果返回 false,则继续传递给 child 执行分发流程。onTouchEvent 该方法主要对事件进行处理,若返回 true 表示已经处理了事件,若返回 false 则表示没有对事件进行处理,需要继续传递事件。一般情况下,默认为 false。展开等人赞过评论7