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

Android中內(nèi)存泄漏需要的注意點(diǎn)

 更新時(shí)間:2019年06月06日 14:19:27   投稿:laozhang  
在本篇文章里小編給大家整理了關(guān)于Android中內(nèi)存泄漏需要的注意點(diǎn)的相關(guān)內(nèi)容,有此需要的朋友們參考下。

內(nèi)存泄漏對(duì)每一位 Android 開發(fā)一定是司空見慣,大家或多或少都肯定有些許接觸。大家都知道,每一個(gè)手機(jī)都有一定的承載上限,多處的內(nèi)存泄漏堆積一定會(huì)堆積如山,最終出現(xiàn)內(nèi)存爆炸 OOM。

而這,也是極有可能在 Android 面試中一道常見的開放題。

內(nèi)存泄漏的根本原因是一個(gè)長(zhǎng)生命周期的對(duì)象持有了一個(gè)短生命周期的對(duì)象。如果你對(duì)垃圾回收機(jī)制有所了解,我想這個(gè)問題基本難不住你,因?yàn)橹懒嗽?,自然不?huì)去觸碰這些極易導(dǎo)致內(nèi)存泄漏的雷區(qū)。

該題重在積累,不需要死記硬背,自己多總結(jié)即可。

1. 長(zhǎng)生命周期對(duì)象持有 Activity

這基本是最常見的內(nèi)存泄漏了,比如

內(nèi)部類形式使用 Handler 同時(shí)發(fā)送延時(shí)消息,或者在 Handler 里面執(zhí)行耗時(shí)任務(wù),在任務(wù)還沒完成的時(shí)候 Activity 需要銷毀。這時(shí)候由于 Handler 持有 Activity 的強(qiáng)引用導(dǎo)致 Activity 無法被回收。

同理內(nèi)部類形式的使用 AsyncTask 執(zhí)行耗時(shí)任務(wù)也會(huì)導(dǎo)致內(nèi)存泄漏的發(fā)生。

單例作為最長(zhǎng)生命周期的對(duì)象,自然不應(yīng)該持有 Activity 從而導(dǎo)致內(nèi)存泄漏發(fā)生;

針對(duì)上面這種情況,基本不必多說了,不要使用內(nèi)部類或者匿名內(nèi)部類做這樣的處理就好了,實(shí)際上 IDE 也會(huì)彈出警告,我想大家應(yīng)該還是都知道采用靜態(tài)內(nèi)部類或者在銷毀頁面的時(shí)候使用相關(guān)方法移除處理的。

Activity 中匿名使用 Handler 實(shí)際上會(huì)導(dǎo)致 Handler 內(nèi)部類持有外部類的引用,而 SendMessage() 的時(shí)候 Message 會(huì)持有 Handler,enqueueMessage 機(jī)制又會(huì)導(dǎo)致 MeassageQueue 持有 Message。所以當(dāng)發(fā)送的是延遲消息那么 Message 并不會(huì)立即的遍歷出來處理而是阻塞到對(duì)應(yīng)的 Message 觸發(fā)時(shí)間以后再處理。那么阻塞的這段時(shí)間中頁面銷毀一定會(huì)造成內(nèi)存泄漏。

2. 各種注冊(cè)操作沒有對(duì)應(yīng)的反注冊(cè)

這一點(diǎn)基本不必多說,相信大家剛剛開始學(xué)習(xí)廣播和 Service 的時(shí)候一定對(duì)此有所接觸,然后就是比如我們常用的第三方框架 EventBus 也是一樣的。平時(shí)使用的時(shí)候注意在對(duì)應(yīng)的生命周期方法中進(jìn)行反注冊(cè)。

3. Bitmap 使用完沒有注意 recycle()

Bitmap 作為大對(duì)象,在使用完畢一定要注意調(diào)用 recycle() 進(jìn)行回收。TypedArray 、Cursor、各種流同理,一定要在最后調(diào)用自己的回收關(guān)閉方法處理。

4. WebView 使用不當(dāng)

WebView 是非常常用的控件,但稍有不注意也會(huì)導(dǎo)致內(nèi)存泄漏。內(nèi)存泄漏的場(chǎng)景: 很多人使用 Webview 都喜歡采用布局引用方式, 這其實(shí)也是作為內(nèi)存泄漏的一個(gè)隱患。當(dāng) Activity 被關(guān)閉時(shí),Webview 不會(huì)被 GC 馬上回收,而是提交給事務(wù),進(jìn)行隊(duì)列處理,這樣就造成了內(nèi)存泄漏, 導(dǎo)致 Webview 無法及時(shí)回收。

目前所知的比較安全的方案是:

在布局中動(dòng)態(tài)添加 WebView。

采用下面的方法。

override fun onDestroy() {
  webView?.apply {
    val parent = parent
    if (parent is ViewGroup) {
      parent.removeView(this)
    }
    stopLoading()
    // 退出時(shí)調(diào)用此方法,移除綁定的服務(wù),否則某些特定系統(tǒng)會(huì)報(bào)錯(cuò)
    settings.javaScriptEnabled = false
    clearHistory()
    removeAllViews()
    destroy()
  }
}

5. 循環(huán)引用

循環(huán)引用導(dǎo)致內(nèi)存泄漏比較少見,正常來講不會(huì)有人寫出 A 持有 B,B 持有 C,C 又持有A 這樣的代碼,不過總還是需要注意。

總的來說,內(nèi)存泄漏很常見,但檢測(cè)方式也很多。我們的 Android Studio 自帶的 Monitors 就可以幫我們找到大部分內(nèi)存問題,當(dāng)然我們也可以采用譬如 LeakCanary 這樣的庫去做檢測(cè)。

相關(guān)文章

  • Android擴(kuò)大View點(diǎn)擊范圍的方法

    Android擴(kuò)大View點(diǎn)擊范圍的方法

    Android4.0設(shè)計(jì)規(guī)定的有效可觸摸的UI元素標(biāo)準(zhǔn)是48dp,轉(zhuǎn)化為一個(gè)物理尺寸約為9毫米。7~10毫米,這是一個(gè)用戶手指能準(zhǔn)確并且舒適觸摸的區(qū)域。本文將介紹Android擴(kuò)大View點(diǎn)擊范圍的方法
    2021-05-05
  • Android 源碼淺析RecyclerView ItemAnimator

    Android 源碼淺析RecyclerView ItemAnimator

    這篇文章主要為大家介紹了Android 源碼淺析RecyclerView ItemAnimator,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Android中監(jiān)聽未接來電的2種方法

    Android中監(jiān)聽未接來電的2種方法

    這篇文章主要介紹了Android中監(jiān)聽未接來電的2種方法,本文講解了使用廣播接收器 BrocastReceiver和使用 PhoneStateListener二種方法,需要的朋友可以參考下
    2015-04-04
  • Android控件之CheckBox、RadioButton用法實(shí)例分析

    Android控件之CheckBox、RadioButton用法實(shí)例分析

    這篇文章主要介紹了Android控件之CheckBox、RadioButton用法,以實(shí)例形式較為詳細(xì)的分析了CheckBox和RadioButton實(shí)現(xiàn)復(fù)選按鈕及單選按鈕功能的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-09-09
  • Android編程實(shí)現(xiàn)自定義手勢(shì)的方法詳解

    Android編程實(shí)現(xiàn)自定義手勢(shì)的方法詳解

    這篇文章主要介紹了Android編程實(shí)現(xiàn)自定義手勢(shì)的方法,結(jié)合實(shí)例形式分析了Android自定義手勢(shì)的功能、相關(guān)函數(shù)與具體實(shí)現(xiàn)步驟,需要的朋友可以參考下
    2016-10-10
  • Android UniversalVideoView實(shí)現(xiàn)視頻播放器

    Android UniversalVideoView實(shí)現(xiàn)視頻播放器

    這篇文章主要為大家詳細(xì)介紹了Android UniversalVideoView實(shí)現(xiàn)視頻播放器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Android實(shí)現(xiàn)動(dòng)態(tài)高斯模糊背景效果

    Android實(shí)現(xiàn)動(dòng)態(tài)高斯模糊背景效果

    在現(xiàn)代 Android UI 中,動(dòng)態(tài)高斯模糊背景 常見于對(duì)話框或彈窗后面的模糊遮罩,相比靜態(tài)模糊圖,動(dòng)態(tài)模糊可隨著內(nèi)容滾動(dòng)或變化實(shí)時(shí)更新,使界面更具層次感與沉浸感,所以本文給大家介紹了Android實(shí)現(xiàn)動(dòng)態(tài)高斯模糊背景效果,需要的朋友可以參考下
    2025-04-04
  • 利用Flutter制作一個(gè)摸魚桌面版App

    利用Flutter制作一個(gè)摸魚桌面版App

    Win10商店上架了一款名為《摸魚》的App,在下載打開之后,這個(gè)App會(huì)讓你的電腦進(jìn)入一個(gè)假更新的畫面。本文將為大家介紹如何通過Flutter制作一個(gè)桌面版的摸魚APP,快跟小編一起學(xué)習(xí)一下吧
    2021-12-12
  • 淺談Android AsyncTask內(nèi)存安全的一種使用方式

    淺談Android AsyncTask內(nèi)存安全的一種使用方式

    這篇文章主要介紹了淺談Android AsyncTask內(nèi)存安全的一種使用方式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • Android利用HorizontalScrollView仿ViewPager設(shè)計(jì)簡(jiǎn)單相冊(cè)

    Android利用HorizontalScrollView仿ViewPager設(shè)計(jì)簡(jiǎn)單相冊(cè)

    這篇文章主要介紹了Android利用HorizontalScrollView仿ViewPager設(shè)計(jì)簡(jiǎn)單相冊(cè)的相關(guān)資料,需要的朋友可以參考下
    2016-05-05

最新評(píng)論

红安县| 甘谷县| 谷城县| 清丰县| 星子县| 平谷区| 五家渠市| 方正县| 巧家县| 观塘区| 包头市| 穆棱市| 新乡市| 黔江区| 利辛县| 郁南县| 巴楚县| 科技| 桃源县| 炎陵县| 金秀| 仙桃市| 达日县| 西华县| 哈尔滨市| 名山县| 龙游县| 梁山县| 江北区| 理塘县| 新宾| 永定县| 龙胜| 社旗县| 阳江市| 天等县| 灌云县| 南涧| 永修县| 三原县| 天台县|