欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

如何解決Android中Handler內(nèi)存泄漏的問題

這篇文章將為大家詳細講解有關如何解決Android中Handler內(nèi)存泄漏的問題,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

成都創(chuàng)新互聯(lián)公司是專業(yè)的吳堡網(wǎng)站建設公司,吳堡接單;提供網(wǎng)站設計、網(wǎng)站建設,網(wǎng)頁設計,網(wǎng)站設計,建網(wǎng)站,PHP網(wǎng)站建設等專業(yè)做網(wǎng)站服務;采用PHP框架,可快速的進行吳堡網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!

在android開發(fā)過程中,我們可能會遇到過令人奔潰的OOM異常,面對這樣的異常我們是既熟悉又深惡痛絕的,因為造成OOM的原因有很多種情況,如加載圖片過大,某已不再使用的類未被GC及時回收等等......本篇我們就來分析其中一種造成OOM的場景,它就是罪惡的內(nèi)存泄漏。對于這樣的稱呼,我們并不陌生,甚至屢次與之"并肩作戰(zhàn)",只不過它就是一個豬隊友,只會不斷送塔.......

本篇分為3部分:

1.Handler內(nèi)存泄漏例子說明以及原理闡明

2.問題驗證(如果感覺繁瑣請直接跳過)

3.Handler內(nèi)存泄漏解決方法

1.Handler內(nèi)存泄漏例子說明以及原理闡明

Handler,我們已經(jīng)相當熟悉了,而且經(jīng)常用得不亦樂乎,但就是因為太熟悉了,才會偶爾被它反捅一刀,血流不止......還記得我們曾經(jīng)滿懷信心地使用著如下的優(yōu)美而又簡潔的代碼不?

如何解決Android中Handler內(nèi)存泄漏的問題

不怕你嚇著,實話告訴你,這個代碼已經(jīng)造成內(nèi)存泄漏了?。?!不相信?我們使用Android lint工具檢測一下該類的代碼:

如何解決Android中Handler內(nèi)存泄漏的問題

面對現(xiàn)實吧,那為什么會這樣呢?在java中非靜態(tài)內(nèi)部類和匿名內(nèi)部類都會隱式持有當前類的外部引用,由于Handler是非靜態(tài)內(nèi)部類所以其持有當前Activity的隱式引用,如果Handler沒有被釋放,其所持有的外部引用也就是Activity也不可能被釋放,當一個對象一句不需要再使用了,本來該被回收時,而有另外一個正在使用的對象持有它的引用從而導致它不能被回收,這導致本該被回收的對象不能被回收而停留在堆內(nèi)存中,這就產(chǎn)生了內(nèi)存泄漏(上面的例子就是這個原因)。最終也就造成了OOM.......我們再來段清晰的代碼,我們來使用mHandler發(fā)送一個延遲消息:

如何解決Android中Handler內(nèi)存泄漏的問題

分析:當我們執(zhí)行了HandlerActivity的界面時,被延遲的消息會在被處理之前存在于主線程消息隊列中5分鐘,而這個消息中又包含了Handler的引用,而我們創(chuàng)建的Handler又是一個匿名內(nèi)部類的實例,其持有外部HandlerActivity的引用,這將導致了HandlerActivity無法回收,進行導致HandlerActivity持有的很多資源都無法回收,從而就造成了傳說中的內(nèi)存泄露問題!

2.問題驗證(如果感覺繁瑣請直接跳過)

為了進一步驗證內(nèi)存泄漏問題,我們在該類中創(chuàng)建一個int數(shù)組,該數(shù)組分配的內(nèi)存大小為2m,然后我們用DDMS來查看heap內(nèi)存,然后使用GC回收,看看內(nèi)存會不會有變化:

如何解決Android中Handler內(nèi)存泄漏的問題

第一次啟動app時,head內(nèi)存為12.5M,已經(jīng)分配內(nèi)容(Allocated):8.5M,空閑內(nèi)存:4M,我們頻繁點擊GC按鈕,內(nèi)存并沒有發(fā)生明顯變化,現(xiàn)在我們點擊手機返回健,推出應用,然后再重新進入,同樣檢測一下head內(nèi)存:

如何解決Android中Handler內(nèi)存泄漏的問題

我們發(fā)現(xiàn)head內(nèi)存:20.5M,Allocated:16.5M,Free:4M,堆內(nèi)存和已經(jīng)分配內(nèi)存近乎翻倍,我們繼續(xù)頻繁點擊GC, 看看能否被回收?結果內(nèi)存并沒有明顯變化,現(xiàn)在我們繼續(xù)點擊手機返回健,推出應用,然后再重新進入,同樣再次檢測一下head內(nèi)存:

如何解決Android中Handler內(nèi)存泄漏的問題

我們發(fā)現(xiàn)head內(nèi)存:28.5M,Allocated:24.5M,Free:4M,堆內(nèi)存和已經(jīng)分配內(nèi)存又增加了,而且無論我們?nèi)绾吸c擊GC回收內(nèi)存,內(nèi)存都沒有明顯變化,而且每啟動一次該頁面,內(nèi)存就增加一倍!這也就說存在在某個類只創(chuàng)建而沒銷毀的情況,其實就是存在內(nèi)存泄漏問題。我們使用MAT工具進一步驗證這個問題,我們來看一組Histogram的數(shù)據(jù)和dominator tree數(shù)據(jù),首先是Histogram的數(shù)據(jù):

如何解決Android中Handler內(nèi)存泄漏的問題

dominator tree數(shù)據(jù):

如何解決Android中Handler內(nèi)存泄漏的問題

同時存在三個一樣的HandlerActivity和內(nèi)部類,這就足以說明HandlerActvity只有創(chuàng)建沒被銷毀了吧,也就是說Handler造成的內(nèi)存泄漏真的存在。

3.Handler內(nèi)存泄漏解決方法

解決這個問題思路就是使用靜態(tài)內(nèi)部類并繼承Handler時(或者也可以單獨存放成一個類文件)。因為靜態(tài)的內(nèi)部類不會持有外部類的引用,所以不會導致外部類實例的內(nèi)存泄露。當你需要在靜態(tài)內(nèi)部類中調(diào)用外部的Activity時,我們可以使用弱引用來處理。另外關于同樣也需要將Runnable設置為靜態(tài)的成員屬性。修改后不會導致內(nèi)存泄露的代碼如下:

package com.zejian.handlerlooper;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import java.lang.ref.WeakReference;
/**
 * Created by zejian on 16/3/6.
 */
public class HandlerActivity extends Activity {
 //創(chuàng)建一個2M大小的int數(shù)組
 int[] datas=new int[1024*1024*2];
// Handler mHandler = new Handler(){
//  @Override
//  public void handleMessage(Message msg) {
//   super.handleMessage(msg);
//  }
// };
 /**
  * 創(chuàng)建靜態(tài)內(nèi)部類
  */
 private static class MyHandler extends Handler{
  //持有弱引用HandlerActivity,GC回收時會被回收掉.
  private final WeakReference<HandlerActivity> mActivty;
  public MyHandler(HandlerActivity activity){
   mActivty =new WeakReference<HandlerActivity>(activity);
  }
  @Override
  public void handleMessage(Message msg) {
   HandlerActivity activity=mActivty.get();
   super.handleMessage(msg);
   if(activity!=null){
    //執(zhí)行業(yè)務邏輯
   }
  }
 }
 private static final Runnable myRunnable = new Runnable() {
  @Override
  public void run() {
   //執(zhí)行我們的業(yè)務邏輯
  }
 };
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_handler_leak);
  MyHandler myHandler=new MyHandler(this);
  //解決了內(nèi)存泄漏,延遲5分鐘后發(fā)送
  myHandler.postDelayed(myRunnable, 1000 * 60 * 5);
 }
}

Handler的內(nèi)存泄漏問題到此分析解決完成。

關于“如何解決Android中Handler內(nèi)存泄漏的問題”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

本文標題:如何解決Android中Handler內(nèi)存泄漏的問題
鏈接地址:http://chinadenli.net/article10/jggido.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供虛擬主機、外貿(mào)網(wǎng)站建設、響應式網(wǎng)站、Google、品牌網(wǎng)站設計、手機網(wǎng)站建設

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設
精品人妻一区二区四区| 日本精品啪啪一区二区三区| 熟女少妇一区二区三区蜜桃| 成年女人午夜在线视频| 91天堂素人精品系列全集| 国产a天堂一区二区专区| 日韩美女偷拍视频久久| 欧美乱妇日本乱码特黄大片| 日韩夫妻午夜性生活视频| 亚洲色图欧美另类人妻| 国产日韩精品激情在线观看| 精品一区二区三区乱码中文| 久久福利视频视频一区二区| 精品欧美日韩一区二区三区 | 亚洲欧美中文字幕精品| 日本人妻的诱惑在线观看| 日韩欧美91在线视频| 久久少妇诱惑免费视频| 婷婷亚洲综合五月天麻豆| 亚洲精品成人福利在线| 久久国产精品热爱视频| 国语对白刺激高潮在线视频| 国内胖女人做爰视频有没有| 国产对白老熟女正在播放| 国产情侣激情在线对白| 欧美激情一区=区三区| 黑丝袜美女老师的小逼逼| 国产成人精品国内自产拍| 国产精品二区三区免费播放心| 白丝美女被插入视频在线观看| 亚洲在线观看福利视频| 超薄肉色丝袜脚一区二区| 亚洲欧美日韩精品永久| 男女午夜福利院在线观看| 国产一二三区不卡视频| 国产欧美日韩在线精品一二区| 亚洲一区二区三区精选| 国产午夜福利在线免费观看| 国产精品一区二区三区欧美| 伊人久久五月天综合网| 精品国产成人av一区二区三区|