1. 程式人生 > >Kotlin中handler避免記憶體洩漏

Kotlin中handler避免記憶體洩漏

前言
Handler在Android開發中經常使用,一不小心就會陷入記憶體洩漏的問題,最近在開發一款Kotlin軟體,針對Handler記憶體洩漏的問題做出瞭解決方案

問題分析
在finish()的時候,Message還沒有被處理,Message持有Handler, Handler持有Activity,這樣阻止了GC對Acivity的回收,就發生了記憶體洩露。正確的寫法應該是使用顯形的引用,靜態內部類與 外部類。使用弱引用WeakReference。 最後在Activity呼叫onDestroy()的時候要取消掉該Handler物件的Message和Runnable

核心程式碼

    private
class MyHandler(activity: thisActivity) : Handler() { private val mActivity: WeakReference<thisActivity> = WeakReference(activity) override fun handleMessage(msg: Message) { if (mActivity.get() == null) { return } val activity = mActivity.get
() when (msg.what) { 0-> { } else -> { } } } } override fun onDestroy() { // Remove all Runnable and Message. MyHandler(this).removeCallbacksAndMessages(null) super.onDestroy() }

About me
Email :[email protected]
Android開發交流QQ群 : 537891203
Android開發交流群

相關推薦

Kotlinhandler避免記憶體洩漏

前言: Handler在Android開發中經常使用,一不小心就會陷入記憶體洩漏的問題,最近在開發一款Kotlin軟體,針對Handler記憶體洩漏的問題做出瞭解決方案 問題分析: 在fini

Android Handler 避免記憶體洩漏之清空佇列

Android開發經常會用到handler,但是我們發現每次使用Handler都會出現:This Handler class should be static or leaks might occur(null)這樣的提示。Android lint就是為了提示我們,這樣使

在 POSIX 執行緒程式設計避免記憶體洩漏

POSIX 執行緒簡介 使用執行緒的主要原因是要提高程式效能。執行緒的建立和管理只需要較小的作業系統開銷和較少的系統資源。一個程序內的所有執行緒共享相同的地址空間,使得執行緒間的通訊更高效,且比程序間通訊更易於實現。例如,如果一個執行緒在等待一個輸入/輸出系統呼叫完成,其他執行緒可以處理 CPU 密集型任務

在JNI程式設計避免記憶體洩漏(二)

JAVA 程式設計中的記憶體洩漏,從洩漏的記憶體位置角度可以分為兩種:JVM 中 Java Heap 的記憶體洩漏;JVM 記憶體中native memory 的記憶體洩漏。 Java 物件儲存在 JVM 程序空間中的 Java Heap 中,Java Heap 可以在 JVM 執行過程中動態變化。如果

在 JNI 程式設計避免記憶體洩漏與崩潰

JNI 程式設計簡介 JNI,Java Native Interface,是 native code 的程式設計介面。JNI 使 Java 程式碼程式可以與 native code 互動——在 Java 程式中呼叫 native code;在 native code 中

Android Weak Handler:可以避免記憶體洩漏Handler

這是一個針對技術開發者的一個應用,你可以在掘金上獲取最新最優質的技術乾貨,不僅僅是Android知識、前端、後端以至於產品和設計都有涉獵,想成為全棧工程師的朋友不要錯過! android使用java作為其開發環境。java的跨平臺和垃圾回收機制已經幫助我們解決了底層的一些問題。但是儘管有了垃圾回收機

AndroidHandler造成記憶體洩露解決方法

Handler在建立時Android Lint會提示出警告: This Handler class should be static or leaks might occur 。

android 如何分析記憶體洩漏

前提條件: 1,電腦安裝了java 執行環境   2,手機端開啟了 USB 除錯開關  3,獲取 root 許可權 4,安裝MAT工具,下載地址:http://www.eclipse.org/mat/downloads.php 基本步驟: 1,使用eclipse 自帶的 D

記憶體優化(二)如何避免記憶體洩漏

文章目錄 一、不同生命週期導致的記憶體洩漏 解決辦法 二、非靜態內部類持有物件導致的記憶體洩漏 1. 非靜態內部類呼叫外部類的方法的 2. 內部類是如

Java會存在記憶體洩漏嗎,請簡單描述。

記憶體洩漏是指不再被使用的物件或者變數一直被佔據在記憶體中。 理論上來說,Java是有GC垃圾回收機制的,也就是說,不再被使用的物件,會被GC自動回收掉,自動從記憶體中清除。 但是,即使這樣,Java也還是存在著記憶體洩漏的情況, 1、長生命週期的物件持有短生命週期物件的引用就很可能

c++避免記憶體洩漏

在c/c++語言對於程式記憶體的管理不像java語言一樣有自己的垃圾回收機制,而c/c++卻要程式設計師手動的釋放用關鍵字new或者 malloc系統函式申請的記憶體空間,然而由於程式設計師的疏忽可能

WKWebViewMessageHandler的記憶體洩漏問題解決過程

背景 專案中使用了WKWebView替換了之前的UIWebView,牽扯到Hybird開發,我們需要和H5互動,所以用到了WKWebViewConfiguration 中的 WKUserContentController 所以初始化程式碼如下 WKUserC

Android使用Handler防止記憶體洩漏

在Android開發中經常會使用handler做定時任務或者更新UI等,但是handler在好用的同時也是非常容易導致記憶體洩漏。因為handler在作為一個類的屬性時會持有該類(通常是activity或fragment)的引用,而handler在傳送messa

詳解java記憶體洩露和如何避免記憶體洩漏

源地址:http://www.xttblog.com/?p=518 一直以來java都佔據著語言排行榜的頭把交椅。這是與java的設計密不可分的,其中最令大家喜歡的不是面向物件,而是垃圾回收機制。你只需要簡單的建立物件而不需要負責釋放空間,因為Java的垃圾回收器會負責記憶

Handle & Inner Classes 如何避免記憶體洩漏

檢視下面一段程式碼 public class SampleActivity extends Activity { private final Handler mLeakyHandler = new Handler() { @Override

Android Activity的記憶體洩漏,原因以及處理方法

文章參考: 八個造成 Android 應用記憶體洩露的原因 Android記憶體洩漏產生的原因以及解決方案OOM android 常見記憶體洩漏原因及解決辦法 記憶體洩漏,說的更直白點,就是你想讓一個物件在下次GC的時候徹底被回收,但是呢,這個物件所處的

Android常見的記憶體洩漏及解決方案

在Android開發中,當一個物件不需要使用了,本該被垃圾回收機制回收,但是另一個正在使用的物件持有它的引用從而導致它不能被正常回收,這就導致本該被回收的物件而不能被回收而停留在堆記憶體中,產生記憶體洩漏。 記憶體洩漏的影響? 由於Android系統為每個應

JAVA 內部靜態類-避免記憶體洩漏的原因

publicclass PrefixTrie {         // supports 7-bit chars.       privatestaticfinalint SIZE = 128;         Node root = new Node();         publicvoid p

Rxjava2定時器週期執行任務,避免記憶體洩漏

private CompositeDisposable mCompositeDisposable = new CompositeDisposable(); private void test() { mCompositeDi

你不必使用弱引用以避免記憶體洩漏

我的一位同事最近提到,他們看到了一個演講,說:“如果你是一個Android開發者,你不使用使用弱引用,將會有問題。” 我個人認為,這不僅是一個錯誤的論點,而且完全是一個誤導。WeakReference應該是修復記憶體洩漏的最後手段。 下面是谷歌開發專家E