回覆列表
  • 1 # 使用者1788346970835

      我的做法是時間換空間,儘量檔案化一些佔用記憶體的資料。最典型的就是ListView中的Bitmap,可以參考這個開源元件的實現。 其將Bitmap都本地檔案快取,記憶體中只保留最近使用的4張圖片,在使用中發現還是會偶爾出現OOM,然後我就將其改為完全的讀取檔案,記憶體中不保留圖片,使用以後都自動回收,由此擴充套件的資料檔案也同樣快取成檔案。

      除了Bitmap,其他的地方沒想到什麼能佔用這麼大記憶體,網路下載下來的資料檔案?需要都留在記憶體中嗎?目前我做的應用,每次請求的資料大小都比較小,每次Http請求下來的資料都把url轉換成檔名,然後快取成檔案,在下次Http請求的時候先根據url來預讀檔案,暫時不用的資料就釋放掉。

      經常會OOM我覺得就是在Bitmap處理的時候,比如decodeFile,在往介面上載入圖片時,不用直接載入原圖,可以進行縮放。一張1000*1000的圖片要載入到一個100*100的ImageView上,直接載入進來大多數都會OOM,可以先用inJustDecodeBounds

      BitmapFactory.Options options = new BitmapFactory.Options();

      options.inJustDecodeBounds = true;

      拿到這個圖片的大小,再算好縮放比例

      int scale = 0;

      scale = (int)(options.outHeight / (float)size);

      if (scale

      scale = 1;

      }

      options.inSampleSize = scale;

      options.inJustDecodeBounds = false;

      再進行decode。

      總之就是儘量時間換空間,實際這個時間是非常非常短的,使用者體驗內的。

  • 中秋節和大豐收的關聯?
  • iphonex釋出快一年半了,那它的OLED屏怎麼樣?