使用匿名類處理程式計時器任務執行緒避免記憶體洩漏

在 android 中,每個開發人員在專案中至少使用一次 Anonymous Class(Runnable)。任何 Anonymous Class 都有對其父(活動)的引用。如果我們執行長時間執行的任務,則在任務結束之前不會銷燬父活動。
示例使用 handler 和 Anonymous Runnable 類。當我們在 Runnable 完成之前退出活動時,記憶體將會洩漏。

  new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            // do abc long 5s or so
        }
    }, 10000); // run "do abc" after 10s. It same as timer, thread...

我們如何解決?

  1. 不要用 Anonymous Class 進行任何長時間操作,否則我們需要一個 Static class 並將 WeakReference 傳遞給它(例如活動,檢視……)。ThreadAnonymous Class 相同。
  2. 當活動被破壞時取消 HandlerTimer