最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android Handler leak分析及解決辦法詳解

 更新時(shí)間:2017年03月13日 10:14:55   投稿:lqh  
這篇文章主要介紹了Android Handler leak分析及解決辦法詳解的相關(guān)資料,需要的朋友可以參考下

Android Handler leak 分析及解決辦法

 In Android, Handler classes should be static or leaks might occur, Messages enqueued on the application thread's MessageQueue also retain their target Handler. If the Handler is an inner class, its outer class will be retained as well. To avoid leaking the outer class, declare the Handler as a static nested class with a WeakReference to its outer class.

    在Android中,Handler類應(yīng)該是靜態(tài)的,否則,可能發(fā)生泄漏。在應(yīng)用程序線程的MessageQueue中排隊(duì)的Message對(duì)象 還保留他們的目標(biāo)Handler。如果Handler是一個(gè)內(nèi)部類(注:無(wú)論是匿名還是非匿名,匿名是比較常見(jiàn)用法),它的外部類將被保留(至于為什么, 請(qǐng)參考Java嵌套類相關(guān)說(shuō)明)。為了避免泄漏外部類,聲明一個(gè)Handler子類為靜態(tài)內(nèi)部類(注:這樣就避免了Handler對(duì)象對(duì)外部類實(shí)例的自動(dòng)引用),其內(nèi)部持有一個(gè)對(duì)外部類對(duì)象的WeakReference。

    上面是HandlerLeak的詳細(xì)解釋,同時(shí)下劃線部分也提供了解決方案的思路。我們需要再分析一下幾個(gè)泄漏問(wèn)題:(1) 排隊(duì)中的Message對(duì)象對(duì)Handler的持有導(dǎo)致泄漏;(2)Handler對(duì)象對(duì)外部類(如Activity或Service)實(shí)例的強(qiáng)引用持 有。是由于這兩個(gè)原因同時(shí)作用導(dǎo)致出現(xiàn)泄漏的可能。我們的解決方案可以從原因出發(fā),清除這兩個(gè)原因,就會(huì)比較完整的解決這個(gè)問(wèn)題。

    方案:(1)針對(duì)第1個(gè)原因,在使用Handler的組件生命周期結(jié)束前清除掉MessageQueue中的發(fā)送給Handler的Message對(duì)象(例如在Activity或Service的onDestroy()中調(diào)用Handler的remove*方法);(2)針對(duì)第2個(gè)原因,Handler的實(shí)現(xiàn)類采用靜態(tài)內(nèi)部類的方式,避免對(duì)外部類的強(qiáng)引用,在其內(nèi)部聲明一個(gè)WeakReference引用到外部類的實(shí)例。

    關(guān)于Handler的remove*方法,這兒介紹一下(可以參考源碼或文檔)

removeCallbacks(Runnable r) ——清除r匹配上的Message。

removeCallbacks(Runnable r, Object token) ——清除r匹配且匹配token(Message.obj)的Message,token為空時(shí),只匹配r。

removeCallbacksAndMessages(Object token) ——清除token匹配上的Message。

removeMessages(int what) ——按what來(lái)匹配

removeMessages(int what, Object object) ——按what來(lái)匹配

我們更多需要的是清除以該Handler為target的所有Message(包括Callback),那么調(diào)用如下方法即可

    handler.removeCallbacksAndMessages(null);

    最終代碼像下面這樣

package org.dragonboy.example;
 
import java.lang.ref.WeakReference;
 
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
 
/**
 * @author dragonboyorg@qq.com
 */
public class MyActivity extends Activity {
  private MyHandler mHandler;
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
 
    mHandler = new MyHandler(this);
  }
 
  @Override
  protected void onDestroy() {
    // Remove all Runnable and Message.
    mHandler.removeCallbacksAndMessages(null);
 
    super.onDestroy();
  }
 
  static class MyHandler extends Handler {
    // WeakReference to the outer class's instance.
    private WeakReference<myactivity> mOuter;
 
    public MyHandler(MyActivity activity) {
      mOuter = new WeakReference<myactivity>(activity);
    }
 
    @Override
    public void handleMessage(Message msg) {
      MyActivity outer = mOuter.get();
      if (outer != null) {
        // Do something with outer as your wish.
      }
    }
  }
}
</myactivity></myactivity>

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • Android操作系統(tǒng)介紹之11種傳感器

    Android操作系統(tǒng)介紹之11種傳感器

    Android是一種基于Linux的自由及開放源代碼的操作系統(tǒng),主要使用于移動(dòng)設(shè)備,如智能手機(jī)和平板電腦,Android是一種基于Linux的自由及開放源代碼的操作系統(tǒng),主要使用于移動(dòng)設(shè)備,如智能手機(jī)和平板電腦,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧
    2016-07-07
  • Android繪制旋轉(zhuǎn)動(dòng)畫方法詳解

    Android繪制旋轉(zhuǎn)動(dòng)畫方法詳解

    這篇文章主要介紹了Android如何采用RotateAnimation繪制一個(gè)旋轉(zhuǎn)動(dòng)畫,文中的實(shí)現(xiàn)方法講解詳細(xì),感興趣的小伙伴可以跟隨小編一起試一試
    2022-01-01
  • 常見(jiàn)android app加固廠商脫殼方法研究

    常見(jiàn)android app加固廠商脫殼方法研究

    這篇文章主要介紹了常見(jiàn)android app加固廠商脫殼方法研究,需要的朋友可以參考下
    2018-01-01
  • Android實(shí)現(xiàn)探探圖片滑動(dòng)效果

    Android實(shí)現(xiàn)探探圖片滑動(dòng)效果

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)探探圖片滑動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Android調(diào)用系統(tǒng)圖庫(kù)獲取圖片的方法

    Android調(diào)用系統(tǒng)圖庫(kù)獲取圖片的方法

    這篇文章主要為大家詳細(xì)介紹了Android調(diào)用系統(tǒng)圖庫(kù)獲取圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 在Android Studio中設(shè)置Button透明度的方法詳解

    在Android Studio中設(shè)置Button透明度的方法詳解

    本文將介紹在Android Studio中如何設(shè)置Button的透明度,首先,我們將展示實(shí)現(xiàn)該功能的整個(gè)流程,并使用表格列出每個(gè)步驟,然后,我們將詳細(xì)說(shuō)明每個(gè)步驟需要做什么,并提供相應(yīng)的代碼和注釋,需要的朋友可以參考下
    2023-09-09
  • 深度剖析Android Binder IPC機(jī)制

    深度剖析Android Binder IPC機(jī)制

    Android系統(tǒng)的成功離不開其強(qiáng)大的IPC(Inter-Process Communication)機(jī)制,其中最引人注目的就是Binder,本文將深入探討B(tài)inder的技術(shù)原理,解釋其工作方式以及相關(guān)的關(guān)鍵概念
    2023-10-10
  • Android中Parcel用法詳解

    Android中Parcel用法詳解

    這篇文章主要介紹了Android中Parcel用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Parcel數(shù)據(jù)容器的原理與使用方法,需要的朋友可以參考下
    2016-06-06
  • 手機(jī)/移動(dòng)前端開發(fā)需要注意的20個(gè)要點(diǎn)

    手機(jī)/移動(dòng)前端開發(fā)需要注意的20個(gè)要點(diǎn)

    本文主要介紹了手機(jī)/移動(dòng)前端開發(fā)需要注意的20個(gè)要點(diǎn),具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-03-03
  • AndroidStudio3.6的卸載安裝,Gradle持續(xù)下載/Gradle Build失敗等問(wèn)題

    AndroidStudio3.6的卸載安裝,Gradle持續(xù)下載/Gradle Build失敗等問(wèn)題

    這篇文章主要介紹了AndroidStudio3.6的卸載安裝,Gradle持續(xù)下載/Gradle Build失敗等問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03

最新評(píng)論

南漳县| 万年县| 东阳市| 工布江达县| 清丰县| 两当县| 全椒县| 海南省| 屯昌县| 新丰县| 六安市| 宜都市| 定远县| 青浦区| 得荣县| 耒阳市| 铜陵市| 贵溪市| 四子王旗| 平湖市| 九台市| 长春市| 安福县| 东阿县| 元阳县| 夹江县| 泰兴市| 高陵县| 诸城市| 永吉县| 安顺市| 固始县| 轮台县| 江城| 衢州市| 元谋县| 永吉县| 永城市| 石林| 铜鼓县| 四会市|