簡體   English   中英

Android XML位圖和OutOfMemoryError

[英]Android XML Bitmap and OutOfMemoryError

我最近在正在處理的android應用程序中遇到了OutOfMemory錯誤,主要是因為我正在按原始大小加載圖像(現在我知道這是個壞主意)。

我現在正在研究實現方法,以根據實際的ImageView大小加載按比例縮小的圖像版本,並按照Google開發者指南中的建議進行緩存。

該指南很好地說明了我應該如何處理和處理運行時以Java代碼加載的圖像,但是卻省略了如何處理布局文件中通過XML定義的圖像。 例如,如果我有一個帶有預定義圖像的ImageView,則XML代碼如下所示:

 <ImageView
        android:id="@+id/my_image_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/my_image"
         />

如果現在我想在運行時替換該圖像,請立即檢查ImageView的寬度和高度,並根據以下尺寸加載新圖像:

imageView.setImageBitmap(decodeSampledBitmapFromResource(Resources res, int resId,
        int reqWidth, int reqHeight)

顯然,對於通過XML定義的圖像還沒有做到這一點。 我是否也需要擔心這些圖像,還是系統為它們處理縮小圖像? 還是應該完全避免通過XML聲明imageview的src?

在此先感謝danijoo

當您從可繪制文件夾中設置圖像時,Android會為您保重。 但是在那種情況下,您也必須提供幫助:)。 例如,如果您僅提供用於drawable-mdpi的圖像,並且確實在hpdi設備中運行應用程序,則android會按比例放大圖像以使其適合屏幕大小,但當然在這樣做之前,它將嘗試查找該圖像的hdpi版本進入drawable-hdpi文件夾。 如果確實將該圖像的hdpi版本提供到drawable-hdpi文件夾中,它將無法縮放。

現在關於OutOfMemoryError,我認為您可能只將圖像放在可繪制或任何低dpi文件夾中,而沒有將該圖像的較大版本放到其他高dpi文件夾中(hdpi / xhdpi / xxhdpi)。

根據文檔:

為不同的屏幕密度提供不同的位圖可繪制對象:默認情況下,Android縮放您的位圖可繪制對象(.png,.jpg和.gif文件)和Nine-Patch可繪制對象(.9.png文件),以便它們以適當的物理尺寸進行渲染在每個設備上。 例如,如果您的應用程序僅為基線,中等屏幕密度(mdpi)提供位圖可繪制對象,則系統在高密度屏幕上會按比例放大它們,而在低密度屏幕上會按比例縮小它們。

我想您會在以下網址找到更多有用的信息: screens_support

從圖庫或照相機中選擇圖像時,使用以下代碼縮小圖像尺寸。

       Intent photoPickerIntent = new Intent(
                        Intent.ACTION_PICK,
                                     android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                // photoPickerIntent.setType("image/*");
                photoPickerIntent.putExtra("crop", "true");
                photoPickerIntent.putExtra("outputX", 512);
                photoPickerIntent.putExtra("outputY", 512);
                photoPickerIntent.putExtra("aspectX", 1);
                photoPickerIntent.putExtra("aspectY", 1);
                photoPickerIntent.putExtra("scale", true);

這會將所需大小的圖像加載到您的應用中,系統不會耗盡內存。

您可以詢問是否還有其他查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM