1. 程式人生 > >Bitmap.createBitmap建立的新bitmap可能與原始bitmap是一個物件

Bitmap.createBitmap建立的新bitmap可能與原始bitmap是一個物件

無意間看到Bitmap.createBitmap的原始碼,發現其中有一句很有趣的話 “The new bitmap may be the same object as source, or a copy may have been made”。如下圖:


於是乎,搜尋了相關內容,看到有一篇文章遇到一種情況,大概是這樣的:

當影象的旋轉角度小於兩個畫素點之間的夾角時,影象即使選擇也無法顯示,因此,系統完全可以認為影象沒有發生變化,因此,就將他們共用一個物件。測試程式碼(摘錄)如下:

ImageView imageView = (ImageView) findViewById(R.id.test);
Matrix matrix = new Matrix();
matrix.setRotate(0.013558723994643297f);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
Bitmap targetBmp = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
if (!bitmap.isRecycled()) {
    bitmap.recycle();
}
imageView.setImageBitmap(targetBmp);

這個bug大概是這樣的,從bitmap創建出targetBmp後,對bitmap執行recycle(),此時呼叫targetBmp出現異常,如下:

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.xys.preferencetest, PID: 30512
                  java.lang.RuntimeException: Canvas: trying to use a recycled bitmap [email protected]


原因很簡單,由於旋轉的角度幾乎為0,基於節省記憶體佔用,targetBmp被視為和bitmap一樣,指向同一個物件,即出現了“may be the same object as source
”。因此,相當於對一個bitmap物件進行了recycle後重新引用其方法,故異常。

為了解決這個bug,其實也很簡單,判斷下bitmap和targetBmp是否相等即可。

相關推薦

Bitmap.createBitmap建立bitmap可能原始bitmap一個物件

無意間看到Bitmap.createBitmap的原始碼,發現其中有一句很有趣的話 “The new bitmap may be the same object as source, or a cop

Twitter類社交平臺 用比例建立的“好壞”社會焦點

Twitter 互聯網全面落地、社交關系被重新結構的當下,信息、資訊等能夠瞬間傳遍全球。而和過往任何一個時代不同的是,愈來愈社交化的媒體能夠很容易判斷一條資訊值不值得關註。因為僅需看看推文的關註、轉發、點贊等數據,就能預測到這條資訊是否會被病毒式傳播,甚至還能分析出哪類資訊、哪類標題更會被關註。 那麽,在這樣

Bitmap createBitmap 相關引數

(一) Bitmap方法相關引數:(1) Bitmap createBitmap (Bitmap src)從原點陣圖src複製出一個新的點陣圖,和原始點陣圖相同(2) Bitmap createBitmap (int width, int height, Bitmap.Con

android檔案快取及SD卡建立資料夾失敗解決和bitmap記憶體溢位解決

 1.相關程式碼:    新增許可權: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:na

使用Bitmap.createBitmap遇到的問題

Bitmap.java中createBitmap函式呼叫的是以下重構方法 public static Bitmap createBitmap(Bitmap source, int x, int y, int width, int height, Ma

Bitmap建立使用( 一)

bitmap點陣圖類 bitmap點陣圖是一種基於rgb顏色編碼的點陣圖形,由畫素組成(一個一個小方塊排列組成)** Bitmap.CompressFormat 列舉類有三個值,指定點陣圖可以被壓

bitmap2-bitmap使用總結

int 處理 == link stdio.h 題目 可用 內存大小 整數 bitmap是一種簡單的數據結構。但在存儲空間壓縮方面卻使用廣泛。 b

九個令人興奮的功能將Java 9 展示兩點

java googl pre api ogl body 特性 gen 大神 HTTP/2 Java 9 中有新的方式來處理 HTTP 調用。這個遲到的特性用於代替老舊的 `HttpURLConnection` API,並提供對 WebSocket 和 HTTP/2 的支持。

mongo創建用戶數據庫

新建庫1cd $MONGO_HOME/bin/./mongo --shutdown --dbpath /data01/app/mongo/data./mongo --fork --logpath /data01/app/mongo/logs/mongodb.log --dbpath /data01/app/m

引用類型原始類型的區別

bject alert for strong https 說明 .com name 3.6 js基本數據類型: js基本數據類型包括:undefined,null,number,boolean,string.基本數據類型是按值訪問的,就是說我們可以操作保存在變量中的實際的值

Android手動回收bitmap,引發Canvas: trying to use a recycled bitmap處理

contex highlight 比較 spa 代碼 soft use itl port 在做Android的開發的時候,在ListView 或是 GridView中需要加載大量的圖片,為了避免加載過多的圖片引起OutOfMemory錯誤,設置了一個圖片緩存列表 Map&l

騰訊技術工程 |騰訊AI Lab刷人臉識別檢測兩大測評國際記錄,技術日調用超六億

smp 數據 ans mib idt 檢測平臺 eight 分享圖片 其他 2017年12月18日,深圳 - 騰訊AI Lab研發的Face R-FCN和FaceCNN算法分別在國際最大、最難的人臉檢測平臺WIDER FACE與最熱門權威的人臉識別平臺MegaFace多項評

算力、真偽、萬物:在華為北研所探秘榮耀10的物種可能

榮耀10不久之前,新華社公眾號在愚人節那天發布了一條《發現手機攝影新物種》的推送,並將地點標註在華為北研所。當天就有讀者留言,問我們這到底是什麽意思,是不是手機AI攝影又要搞個大新聞?很巧的是,很快腦極體就有幸受邀前往華為北研所,對手機攝影新物種這件事進行了探訪,並與華為海思芯片產品市場總監周晨與榮耀產品副總

/dev/mapper/VolGroup-lv_root爆滿兩種可能及根分區擴容

linux 運維 系統 擴容 磁盤 /dev/mapper/VolGroup-lv_root是一個邏輯卷,通過df –h命令你可以發現它與“/”根分區相關聯,你也可以理解為它就是根分區。 [root@localhost ~]# df -h Filesystem Siz

Spring的jdbcTemplate 原始jdbc 整合c3p0的DBUtils 及Hibernate 對比

throws 殺手鐧 type .org 連接數 tco 一個 iso aso 以User為操作對象 package com.swift.jdbc; public class User { private Long user_id; priva

社匯微會動產品服務上線發布會近日在北京國家數字出版基地成功舉辦

lis tex proc 行業 mage ims 下午 ffffff ces 2018年6月26日下午,由中國低碳智慧園區聯盟指導,北京新薈友科技有限公司(新社匯)發起並主辦的“O2O2O數字化全運整合高端論壇暨新社匯與微會動產品服務上線發布會”在北京國家數字出版基地成功舉

實驗12-06 建立的名為“bookview”的視圖

class nbsp author from edi pre ubd lec date 在Exam數據庫中建立名為“bookview”的視圖,該視圖檢索“出版社A”出版的所有圖書的圖書名稱、作者和出版日期 c

統一采集日誌,自定義日誌分析器、為什麽要創建字段?提取和建立字段索引

ffffff oss text images 為什麽 RoCE image ado 技術 統一采集日誌,自定義日誌分析器、為什麽要創建新字段?提取和建立新字段索引

github上建立的分支

新增新分支的步驟分解 第一步:git branch,用來檢視當前分支情況 git branch //檢視當前分支情況 第二步:git branch 分支名,用來新建一個自己的分支 git branch 分支名 //新建一個自己的分支 此時git branch