Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android 圖片加載,OOM 問題

android 圖片加載,OOM 問題

編輯:關於Android編程

\

 

\

 

\

首先處理這個問題,用了1個星期,非常努力,拼命的尋找哪裡出現了OOM 內存溢出的問題,可是都沒找到結果,一直以為是自己使用的Picaso加載圖片框架,只加載了圖片,但是activity 銷毀時,沒有做內存釋放的功能,所以自己去嘗試方法去解決問題:

 

1.換一個圖片框架:Xutil 圖片框架

結果只是換湯不換藥。 還是會出現OOM ,內存溢出問題

 

2.圖片單獨處理:網上說針對於大圖,要做縮放處理,並對生成的BitMap 對象進行內存處理

 

 private void initDisplayImageOption(){
        options = new DisplayImageOptions.Builder()
                .showImageOnLoading(R.drawable.video_default) //設置圖片在下載期間顯示的圖片
                .showImageForEmptyUri(R.drawable.image_background_empty) //設置圖片Uri為空或是錯誤的時候顯示的圖片
                //.showImageOnFail(R.drawable.image_background_erro) //設置圖片加載/解碼過程中錯誤時候顯示的圖片
                .cacheInMemory(false) //設置下載的圖片是否緩存在內存中
                .cacheOnDisk(true) //設置下載的圖片是否緩存在SD卡中
                .considerExifParams(true) //是否考慮JPEG圖像EXIF參數(旋轉,翻轉)
                .imageScaleType(ImageScaleType.EXACTLY_STRETCHED) //設置圖片以如何的編碼方式顯示
                .bitmapConfig(Bitmap.Config.RGB_565) //設置圖片的解碼類型//
               //.decodingOptions(android.graphics.BitmapFactory.Options decodingOptions) //設置圖片的解碼配置
                .delayBeforeLoading(0) //int delayInMillis為你設置的下載前的延遲時間
                .resetViewBeforeLoading(true)//設置圖片在下載前是否重置,復位
                .displayer(new FadeInBitmapDisplayer(100))//是否圖片加載好後漸入的動畫時間
                .build();//構建完成
    }

    @Override
    protected void onDestroy() {
        mam.popOneActivity(HostessDetailUI.this);

        Log.e("onDestroy() isRun!!!");
        mHostessImgs.setAdapter(null);

        /**釋放圖片,控件圖片引用資源*/
        BitmapDrawable bitmapDrawable = (BitmapDrawable) mHostessMiddle.getBackground();
        mHostessMiddle.setBackgroundResource(0);
        bitmapDrawable.setCallback(null);
        drawable.setCallback(null);
        Bitmap bitmap = bitmapDrawable.getBitmap();
        if(bitmap != null && !bitmap.isRecycled()){
            bitmap.recycle();//回收圖片所占的內存
            bitmap = null;
        }
        btp.recycle(); //回收圖片所占的內存
        System.gc();


        super.onDestroy();

    }

結果還是報oom問題,而且日志也沒有看見GC操作,內存從16MB 跑到96MB 直接閃退,

 

 

3.換一種強大的圖片框架:Universal-Image_loader(UIL)

看見網上說UIL是目前最流行,用戶最多,個人配置最全的圖片框架,於是乎自己換掉picaso,來到UIL的懷抱,可是還是報OOM問題,每次看日志都是跑到96MB閃退。

自己懷疑是自己對UIL理解不深,配置不全,還是沒有釋放內存。(有時間詳細看下UIL源碼實現)

 

4.換上最新的圖片處理框架:Facebook 推薦的fresco 框架

 

dependencies {
            compile 'com.facebook.fresco:fresco:0.5.0+'
        }

因為這方面的講解很少,自己看了一會兒,覺得好復雜,於是去看了一下官網文檔在AS的使用介紹,簡單的幾個操作,加入到了自己的項目,沒有像其他人說的要配置NDK,編譯什麼的。然後跑起來運行,果然!!內存堆沒有在像以前那樣到達96MB OOM問題了,真的是最新的東西會越好

 

 

5.去掉後台的大圖,顯示完整

程序不崩潰了,心裡有很多的安慰,畢竟問題已經出現了1個星期了,然而還是有一些個別的圖片很久都加載不出來,fresco框架這麼好,為什麼還是有圖片加載不出來你。然後看日志 提示:加載圖片太大,無法下載出來,於是看了下後台拉取的圖片大小。納尼。, 一張圖片7MB!! 再完美的框架針對這種圖片也是沒辦法的吧,所以讓後台處理的圖片規格。

 

最終解決辦法:換上fresco框架+後台圖片縮小處理。現在程序不會出現OOM問題了。好開心!(不過內存釋放問題,自己還是沒有做好,有待提高!)

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved