Android加載圖片OOM錯誤解決方式

?

前幾天做項目的時候,甲方要求是PAD (SAMSUNG P600 10.1寸 2560*1600)的PAD上顯示高分辨率的大圖片。

SQLITE採用BOLD方式存儲圖片,這個存取過程就不說了哈,網上一大堆。

可是在加載/讀取/顯示圖片的時候會報OOM錯誤,上網查了非常多解決方式還繞了非常多彎路,最后還是找到了原因所在。以下從幾個方面來解釋一下OOM問題的解決方式。

(謝謝周同學的“尺寸”提醒。不然我可能一輩子都要蒙在鼓里)

?

1.Android APP內存

做一個APP開發的時候,還是不要想著去擴大Android系統賦予的內存上限了。部分老機型老系統16M。大部分都是24M了。

一些大型游戲用dalvik.system.VMRuntime來干涉GC過程(這個類我還沒有學過。

。剛聽說不久)。

據說用NDK開發時候,C能夠動態申請多余的內存空間,可是我沒用過NDK,今后也不打算用了(個人原因)。

?

2.圖片文件大小

甲方給了一大堆文件大小不一的圖片,在加載數據庫->讀取出來->顯示出來的這個過程中,出現了非常多OOM,分為:

a.加載圖片時使用ByteArrayStream創建流,size為Height * Width * 4。OOM;

b.讀取圖片時候OOM,同上;

c.顯示圖片時候OOM,decodeResource函數報錯,OOM;

開始時候以為是文件大小問題。后來發現有些2M的圖片都能顯示,可是某些1M的圖片確報錯。所以在一定范圍內,能夠證明。圖片OOM問題與文件大小無關。

?

3.圖片尺寸(分辨率)

調查這些能顯示的圖片和不能顯示的圖片的不同。發現長寬差距非常大。那些能成功顯示的圖片為1005*1500大小,而其它圖片都是3000*5000以上。

我用PAINT(一款適合小白的圖像處理軟件。盡管不如PS可是功能已經很強大了,最新版須要安裝NET 4.5)壓縮了圖片大小。壓縮到1005*1500。顯示成功。

?

4.函數調用

閱讀了這位大神的博客:

http://blog.csdn.net/huangbiao86/article/details/8072128

摘取當中最精華的部分吧:

盡量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource來設置一張大圖,由于這些函數在完畢decode后。終于都是通過java層的createBitmap來完畢的。須要消耗很多其它內存。

?

因此,改用先通過BitmapFactory.decodeStream方法,創建出一個bitmap,再將其設為ImageView的 source,decodeStream最大的秘密在于其直接調用JNI>>nativeDecodeAsset()來完畢decode。無需再使用java層的createBitmap,從而節省了java層的空間。


假設在讀取時加上圖片的Config參數,能夠跟有效降低載入的內存。從而跟有效阻止拋out of Memory異常


另外。decodeStream直接拿的圖片來讀取字節碼了。 不會依據機器的各種分辨率來自己主動適應,?使用了decodeStream之后,須要在hdpi和mdpi,ldpi中配置對應的圖片資源,?否則在不同分辨率機器上都是相同大小(像素點數量),顯示出來的大小就不正確了。

看來讀底層源代碼還是非常實用的,setImageBitmap 和 setImageResource 和 decodeResource在運行過程中還是調用了createBitmap來創建一個新的bitmap。創建bitmap會加劇內存消耗,所以不推薦使用了。應該使用decodeStream方法。

圖片的壓縮過程也能夠設置一個合適的百分比來控制大小。

多張圖片的使用中,請注意流的flush與close(我沒有及時flush和close的時候也執行正確了,這個有待研究一下,可是為了保證一個良好的習慣還是注意下吧)。

?

5.關于options方法

網上還有非常多文章用BitmapFactory.Options來作為decodeStream時候的一個參數,這個我臨時沒有詳細實驗過,哪位朋友實驗過了能夠回復交流哈

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

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

相關文章

C# 對Ini文件操作(C# ini文件操作類)

*************************************************** 更多精彩,歡迎進入:http://shop115376623.taobao.com *************************************************** /* C# 對Ini文件操作(C# ini文件操作類) [IniFiles.cs] 蝶曉…

python對文件進行讀寫操作

2019獨角獸企業重金招聘Python工程師標準>>> python進行文件讀寫的函數是open或file file_handler open(filename,,mode) Table mode 模式描述r以讀方式打開文件,可讀取文件信息。w以寫方式打開文件,可向文件寫入信息。如文件存在…

android:contentDescription

android:contentDescription這個屬性相信大家并不陌生,在ImageButton的使用過程中如果不添加這個屬性會有警告信息。 那么android:contentDescription究竟是干什么的呢?今天查了下資料才知道這個屬性的真正作用。 該屬性為視力障礙的用戶提供方便&#x…

c#中bin,obj,properties文件夾的作用

*************************************************** 更多精彩,歡迎進入:http://shop115376623.taobao.com *************************************************** Bin目錄用來存放編譯的結果,bin是二進制binrary的英文縮寫,因為…

getAttribute實例例java_Java ExifInterface.getAttribute方法代碼示例

import android.media.ExifInterface; //導入方法依賴的package包/類public static void copyExif(ExifInterface originalExif, int width, int height, String imageOutputPath) {String[] attributes new String[]{ExifInterface.TAG_APERTURE,ExifInterface.TAG_DATETIME,…

檢測SDWebImage有沒有緩存圖片 IOS 獲取網絡圖片大小

判斷圖片是否緩存NSURL *url [NSURL URLWithString:[model.content objectForKey:"image"]];//請求網絡地址數據的同步方法//因為這個方法在子線程(全局隊列)中執行,所以不需要考慮死線程的問題SDWebImageManager *manager [SDWebImageManager sharedManager];[man…

mac 下 使用 java運行 class 文件 總是提示 “錯誤: 找不到或無法加載主類”的解決方法...

發現問題 切換到mac平臺后,突然想寫點程序運行在mac下,想到mac自帶java,會方便好多。不過在這過程中遇到了麻煩: 總是提示 “錯誤: 找不到或無法加載主類” 工程結構 查了好久,終于找到原型所在,發現網上很…

[轉]VisualStudio如何組織解決方案的目錄結構

*************************************************** 更多精彩,歡迎進入:http://shop115376623.taobao.com *************************************************** 解決方案與項目: 從VC6之后VC系列就使用解決方案(Solution&…

java幾種刪除_幾種刪除Linux目錄的方法

在Linux中有很多方法可以刪除目錄,在圖形化界面可以利用文件管理器,或者通過終端刪除。本文將介紹在文本界面使用命令刪除目錄。使用rmdir刪除目錄Rmdir命令間成“remove directory”,用于刪除空目錄的命令。例如,刪除一個名為“M…

php公鑰模數,php – 如何從公共指數和RSA模數生成DER / PEM證書?

眾所周知,公鑰由公共指數和模數組成.我的問題是:如何從公共指數和RSA模數生成DER / PEM證書?非常感謝你提前.解決方法:使用公共指數和模數,你可能希望做的最好的事情是得到這樣的東西:-----BEGIN PUBLIC KEY-----MIGGAoGAfHlcdrcuOK6C02rbGR3…

C# DataTable的詳細用法

*************************************************** 更多精彩,歡迎進入:http://shop115376623.taobao.com *************************************************** DataTable 是一個臨時保存數據的網格虛擬表(表示內存中數據的一個表。)。DataTable是A…

【SpringMVC】SpringMVC系列6之@CookieValue 映射請求Cookie 值

6、CookieValue 映射請求Cookie 值 6.1、示例 CookieValue 可讓處理方法入參綁定某個 Cookie 值,示例如下:

杭電OJ-2104_hide handkerchief超簡潔代碼

#include<iostream> using namespace std; int n, m;; int zz(int a, int b) {return b0 ? a: zz(b, a%b); } int main() {while (cin >> n >> m&&n ! -1 && m ! -1)cout << (nb(n, m) 1 ? "YES" : "POOR Haha"…

php 年月日 中文,轉換中文日期的PHP程序

轉換中文日期的PHP程序本程序將中文日期輸出為2001-12-23&#xff0c;并很好解決了“十”的問題&#xff0c;如“十一”和“二十一”中“十”的處理&#xff01;稍加修改可改為函數。跟隨小編去看看吧&#xff01;希望對大家有所幫助&#xff01;$str"二零○一年十二月二十…

c# Invoke和BeginInvoke

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** 轉自&#xff1a;http://blog.3snews.net/html/30/34530-27563.html在多線程編程中&am…

Oracle手邊常用70則腳本知識匯總

Oracle手邊常用70則腳本知識匯總 作者&#xff1a;白寧超 時間&#xff1a;2016年3月4日13:58:36 摘要: 日常使用oracle數據庫過程中&#xff0c;常用腳本命令莫不是用戶和密碼、表空間、多表聯合、執行語句等常規操作。另外表的導入導出也很常用&#xff0c;這些腳步命令之前都…

php常見的面試題目

一. 基本知識點1.1 HTTP協議中幾個狀態碼的含義:503 500 401 403 404 200 301 302。。。200 : 請求成功&#xff0c;請求的數據隨之返回。301 : 永久性重定向。302 : 暫時行重定向。401 : 當前請求需要用戶驗證。403 : 服務器拒絕執行請求&#xff0c;即沒有權限。404 : 請求失…

php表示私有變量的是,PHP 訪問私有和受保護的成員變量

示例反射通常用作軟件測試的一部分&#xff0c;例如在運行時創建/實例化模擬對象。這對于在任何給定時間點檢查對象的狀態也非常有用。這是在單元測試中使用Reflection來驗證受保護的類成員是否包含期望值的示例。下面是一個非常基礎的汽車課。它具有受保護的成員變量&#xff…

BZOJ2683 簡單題(CDQ分治)

傳送門 之前聽別人說CDQ分治不難學&#xff0c;今天才知道果真如此。之前一直為自己想不到CDQ的方法二很不爽&#xff0c;今天終于是想出來了一道了&#xff0c;太弱…… cdq分治主要就是把整段區間分成兩半&#xff0c;然后用左區間的值去更新右區間的答案&#xff0c;每次把…

VS2010斷點設置技巧

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** 許多Visual Studio下的程序員&#xff0c;甚至一些很有經驗的開發人員&#xff0c;都不…