加載一張圖片到ImageView到底占據多少內存

https://blog.csdn.net/BUG_delete/article/details/79557939

簡介

Android中經常要通過ImageView進行圖片資源顯示。在加載圖片時,首先要考慮的兩個因素就是體驗問題和性能問題。

其中,體驗問題是指圖片顯示的是否正確(例如Universal-Image-Loader在適配Adapter圖片資源時會導致圖片顯示錯位),分辨率是否合適等。而體驗問題主要是指圖片加載速度,以及更加重要的圖片加載的內存占用問題。本文重點介紹ImageView加載圖片中的內存占用問題。

問題

在開發的過程中,經常會發現因為加載圖片而引起的Out of Memory(OOM)問題,有的時候會很奇怪,明明加載的圖片只有幾十K,為什么就會導致OOM呢?另外在圖片資源設置過程中,只放置某一個dpi文件夾(例如drawable-xxhdpi文件夾)的資源,在不同設備中對ImageView占用會有影響嗎?下面會對圖片加載的內存占用相關問題進行展開分析。

概念描述

首先,圖片對內存的占用是一個疊加的過程,也就是說圖片資源不是及時釋放的,使用過的圖片在回收過程中可能會有一定程度的延遲。此外,很多時候圖片所依附的Activity是出于當前Activity棧底的狀態,再GC回收過程,這樣的bitmap資源會被認為是活躍狀態的,不會被Android系統回收。

另外一方面,Android中圖片加載到內存中的內存占用跟圖片的實際大小沒有直接的關系,甚至于圖片的實際像素尺寸也沒有直接的關系。

在這里,首先要介紹幾個概念(以圖片A:尺寸60*60 大小2.02K為例):

  • 圖像尺寸:表示圖像在硬盤中的原始尺寸,本例中為60*60;
  • 圖像大小:表示圖像在占據硬盤容量大小,本例中為2.02K;
  • bitmap尺寸:表示圖像以bitmap的形式存在內存中的實際尺寸;
  • 顯示尺寸:表示圖像在UI上顯示的實際尺寸;
  • 內存占用:表示加載的圖片以bitmap的形式在內存中的實際占用。

其中,bitmap尺寸和內存占用可以通過下面的方法得到:

   /**** 計算ImageView中加載圖片的具體尺寸和內存占用大小* @param imageView*/private void calculateBitmapInfo(ImageView imageView) {Drawable drawable = imageView.getDrawable();if (drawable != null) {BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;Bitmap bitmap = bitmapDrawable.getBitmap();Log.d(TAG, " bitmap width = " + bitmap.getWidth() + " bitmap height = " + bitmap.getHeight());Log.d(TAG, " memory usage = " + bitmap.getAllocationByteCount());/**bitmap.getByteCount()方法不再使用*/} else {Log.d(TAG, "drawable is null!");}}

具體分析

為了明確這個問題,我們做了以下的幾組實驗對比,具體如下:

實驗1

測試方案:將尺寸為圖片A(尺寸60 * 60 大小2.02K),圖片B(尺寸60 * 60 大小1.63K),將圖片均放入drawable-xxhdpi文件夾,圖片顯示尺寸采用wrap_content,用華為mate 9(xxhdpi)手機進行測試;

測試結果:二者內存占用均為14400Byte,bitmap尺寸為60*60;

結果分析:說明內存占用單獨與圖片原始大小沒有關系。

實驗2

測試方案:將將尺寸為圖片A(尺寸60 * 60 大小2.02K)放入drawable-xxhdpi文件夾,圖片顯示尺寸設置為30dp * 30dp和60dp * 60dp,分別用mate 9手機進行測試;

測試結果:內存占用均為14400Byte,bitmap尺寸均為60*60;

結果分析:說明內存占用與圖片的實際顯示尺寸沒有關系。

實驗3

測試方案3:將將尺寸為圖片A(尺寸60*60 大小2.02K)放入drawable和drawable-xxhdpi文件夾,圖片顯示尺寸采用wrap_content,分別用mate 9手機進行測試;

測試結果:內存占用分別為129600Byte和14400Byte,圖片在ImageView中的bitmap尺寸為180 * 180和60 * 60;

結果分析:說明內存占用與圖片的原始尺寸沒有關系,與bitmap尺寸有密切的關系。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449982.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449982.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449982.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql -u root -p 解釋

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 mysql -u 用戶名 -p 密碼 是連接數據庫服務器的命令。要求你輸入自己連接數據庫的用戶名和密碼。 考慮密碼如果直接明文寫在這條命令行…

hbase 概念

在hbase里面有幾個通俗的名稱會經常出現 1)Hregion region 2)Hregionserver regionserver 3)Hmaster master 4)Hmamstore memstore 5)Hfile storeFile 1、什么是hbase? 1)它是基于稀疏的、…

beta沖刺第三天

團隊成員 鄭西坤 031602542 (隊長) 陳俊杰 031602504陳順興 031602505張勝男 031602540廖鈺萍 031602323雷光游 031602319吳志鴻 0316206341.昨天的困難 陳順興:理解別人的代碼 廖鈺萍: 吳志鴻:無 雷光游: …

多線程詳解

1. 進程與線程有那些區別和聯系?   每個進程至少需要一個線程。 進程由兩部分構成:進程內核對象,地址空間。線程也由兩部分組成:線程內核對象,操作系統用它來對線程實施管理。線程堆棧,用于維…

AirPods的自動連接配對原理

首次連接 打開裝有 AirPods 的充電盒,并將它放在 iPhone 旁邊。此時你的 iPhone 上將出現設置動畫。輕點「連接」,然后輕點「完成」。 就這么簡單,而且會自動設置,實現與已使用同一 Apple ID 登錄 iCloud 的任一支持設備搭配使用…

Linux chmod命令

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 Linux/Unix 的文件調用權限分為三級 : 文件擁有者、群組、其他。利用 chmod 可以藉以控制文件如何被他人所調用。 使用權限 : 所有使用…

模塊化

我那進了"模塊化研究"小組.所以嘞.研究模塊化以及如何讓項目的模塊化更加合理和高效是我們小組的主要目的.首先,在實行模塊化之前,得先鞏固模塊化開發的理論基礎,因為理論是實踐的基礎。只有這樣,在過程中理論與實踐相結合,才有可能達到最滿意…

1566:基礎練習 十六進制轉八進制

題目地址&#xff1a;https://acmore.cc/problem/LOCAL/1566 1 #include <iostream>2 #include <string>3 4 using namespace std;5 6 string HexToBin(string s) //16進制轉2進制7 {8 string str "";9 for (int i 0; i < s.size(); i) 10…

利用fastjson對json轉map的操作

String str "{\"0\":\"zhangsan\",\"1\":\"lisi\",\"2\":\"wangwu\",\"3\":\"maliu\"}"; //第一種方式 Map maps (Map)JSON.parse(str); System.out.println("這個是用J…

推薦書籍

五百本編程書籍推薦【信息化類】 書號書名作者出版時間定價對應頁碼TP02041企業資源計劃&#xff08;ERP&#xff09;教程羅鴻2006-1&#xffe5;28.00—TP02031ERP理論、方法與實踐周玉清 等2005-12&#xffe5;39.00—TP01059ERP原理設計實施&#xff08;第3版&#xff09;羅…

Linux diffstat命令

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Linux diffstat命令根據diff的比較結果&#xff0c;顯示統計數字。 diffstat讀取diff的輸出結果&#xff0c;然后統計各文件的插入&…

java命令--jmap命令使用(查找內存泄漏對象)

轉自&#xff1a;https://www.cnblogs.com/kongzhongqijing/articles/3621163.html jdk安裝后會自帶一些小工具&#xff0c;jmap命令(Java Memory Map)是其中之一。主要用于打印指定Java進程(或核心文件、遠程調試服務器)的共享對象內存映射或堆內存細節。 jmap命令可以獲得運行…

tr069相關協議說明

截圖自easycwmp官網&#xff1a;http://easycwmp.org/轉載于:https://www.cnblogs.com/kiss-passion/p/10362029.html

如何revert一個merged branch上所有的改動

開發過程中如果想刪除之前merged的某個branch&#xff0c;并且在merge過該分支之后又進行了多次的提交&#xff0c;可以通過以下命令進行&#xff1a; git revert -n merge_commit_id -m 1 注&#xff1a;該方法適合merge過分支后&#xff0c;沒有基于該branch內容做修改的情況…

Beta 沖刺(6/7)

隊名 火箭少男100組長博客 林燊大哥作業博客 Beta 沖鴨鴨鴨&#xff01;成員沖刺階段情況 林燊&#xff08;組長&#xff09; 過去兩天完成了哪些任務 協調組內工作最終測試文稿編寫展示GitHub當日代碼/文檔簽入記錄(組內共享)接下來的計劃 協助開發組完成標簽制作展示視頻制作…

Linux find命令、Linux rmdir命令、Linux ls命令

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Linux find命令用來在指定目錄下查找文件。任何位于參數之前的字符串都將被視為欲查找的目錄名。如果使用該命令時&#xff0c;不設置任…

Android Bluetooth BLE相關開發資源匯總

Android開啟藍牙開關 轉載自Android&#xff1a;Bluetooth 的打開和關閉 檢查系統藍牙是否開啟 BluetoothManager bluetoothManager (BluetoothManager) this. getSystemService(Context.BLUETOOTH_SERVICE); BluetoothAdapter mBluetoothAdapter bluetoothManager.getAdapt…

__invoke,try{}catch(){},microtime(),is_callable()

<?php /*1.對象本身不能直接當函數用&#xff0c;如果被當做函數用&#xff0c;會直接回調__invoke方法* 2.驗證變量的內容能否作為函數調用* 3.try{}catch(Exception $e){}catch(){}finally{}* 4.microtime()函數返回當前時間戳和微妙數* */ class httpException extends …

H.264中的I_PCM模式

H.264中的I_PCM模式 I_PCM是一種幀內編碼模式&#xff0c;在該模式下&#xff0c;編碼器直接傳輸圖像的像素值&#xff0c;而不經過預測和變換。在一些特殊的情況下&#xff0c;特別是圖像內容不規則或者量化參數非常低時&#xff0c;該模式比常規的操作&#xff08;幀內預測…

RxPermissions 源碼解析之舉一反三

[toc] RxPermissions 源碼解析 簡介 RxPermissions 是基于 RxJava 開發的用于幫助 在Android 6.0 中處理運行時權限檢測的框架。在 Android 6.0 中增加了對危險權限的動態申請&#xff0c;而不是像 Android 6.0 之前的默認全部獲取的方式。 原始動態權限的獲取 如果按照以往的獲…