解決方案:android onstop 延遲迴調 10s的問題

概述

近期碰到activity onstop延遲迴調10s的問題。
關於問題的具體復現和原因,有博主總結的很不錯,此處給上原鏈接:
深入分析Android中Activity的onStop和onDestroy()回調延時及延時10s的問題

此文主要記錄一下筆者目前認爲的解決方案,以及各方案的優劣。

1、避免過度頻繁或耗時的主線程操作

假設現在是ActivityOne跳轉到ActivityTwo,那麼有兩種情況都會導致延遲執行:

  1. ActivityOne頻繁執行主線程操作,比如一些循環執行的動畫操作。
  2. ActivityTwo在onCreate或者onStart中執行一些耗時或者頻繁的主線程操作。

優勢

從根源上解決了問題。

劣勢

  1. 去動原來的邏輯就意味着風險,改動越大風險越大。
  2. 實際項目中,模塊間往往是解耦的。有可能ActivityOne是我負責的,而ActivityTwo則是其他團隊負責了。
  3. 有些頻繁或者耗時的主線程操作由於業務原因沒法去掉,或者去掉的風險太高。

2、使用EventBus

假設現在是ActivityOne跳轉到ActivityTwo,那麼在ActivityTwo執行到onCreate的時候就拋出事件,然後在ActivityOne中接收事件,做與onstop中一樣的處理。

優勢

幾乎不會影響代碼原來的邏輯,風險很低。

劣勢

  1. 項目需要支持EventBus。(EventBus一旦濫用,代碼會非常噁心,因此很多項目直接不允許用EventBus)
  2. 這種情況更適合一些公用的頁面,比如登錄頁面,webview頁面,視頻播放頁面等。在這些場景下,拋出這個事件纔會比較合理。
  3. 如果原來沒有這塊邏輯,仍然需要在兩個activity中都改。

3、監控所有activity的生命週期

假設現在是ActivityOne跳轉到ActivityTwo,在ActivityOne中監控所有activity的生命週期,在ActivityTwo的onCreate執行到的時候,去執行onstop的邏輯。

優勢

只需要在ActivityOne中新增邏輯即可,不需要動ActivityTwo。

劣勢

  1. 需要靠譜的識別activity的方式。如果僅使用ActivityTwo的類名作爲識別方式,那麼如果ActivityTwo一旦改名,這塊邏輯就會有問題。
  2. 難以判斷行爲軌跡,假設現在有A,B,C三個activity。
    我只想監控A到B的情況,如果我只判斷B的onCreate的話,那麼如果A到C再到B也會被監控到。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章