簡體   English   中英

方法MediaStore.Images.Media.getBitmap(cr,uri); 返回位圖大小超出VM預算

[英]method MediaStore.Images.Media.getBitmap(cr, uri); returns bitmap size exceeds VM budget

我對此代碼有疑問:(錯誤在代碼下方)

public class ChooseImage extends Activity
{

private static final int DELETE_DIALOG = 1; 

private Gallery gallery = null; 

private int selectedImageId; 


  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState); 
       gallery = new Gallery(this); 
      Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 
      String[] projection = { MediaStore.Images.Media._ID }; 
      String selection = null; 
      String[] selectionArgs = null; 
      String sortOrder = null; 
      Cursor cursor = managedQuery(uri, projection, selection, selectionArgs, sortOrder); 

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

      gallery.setAdapter(new CursorAdapter(this, cursor, true) { 

        public View newView(Context context, Cursor cursor, ViewGroup parent) { 
                int id = cursor.getInt(0); 
                ContentResolver cr = getContentResolver(); 
                Uri uri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id); 
                Bitmap image = null; 

        try { 
            image = MediaStore.Images.Media.getBitmap(cr, uri); 
        } catch (Exception e) { 
         Log.e("Error", "Error", e); 
        } 

            ImageView imageView = new ImageView(context); 
            imageView.setId(id); 
            imageView.setScaleType(ScaleType.CENTER_INSIDE); 

            imageView.setImageBitmap(image); 
            return imageView; 
       }

        @Override
        public void bindView(View view, Context context, Cursor cursor) {
            // TODO Auto-generated method stub

        } 
      }); 

      LinearLayout linearLayout = new LinearLayout(this); 
      linearLayout.addView(gallery); 
      setContentView(linearLayout); 

  }
}

錯誤是:

07-03 15:40:59.978: E/AndroidRuntime(887): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
07-03 15:40:59.978: E/AndroidRuntime(887):  at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
07-03 15:40:59.978: E/AndroidRuntime(887):  at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:469)
07-03 15:40:59.978: E/AndroidRuntime(887):  at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:525)
07-03 15:40:59.978: E/AndroidRuntime(887):  at android.provider.MediaStore$Images$Media.getBitmap(MediaStore.java:712)
07-03 15:40:59.978: E/AndroidRuntime(887):  at com.entDan.imagefun.ChooseImage$1.newView(ChooseImage.java:58)
07-03 15:40:59.978: E/AndroidRuntime(887):  at android.widget.CursorAdapter.getView(CursorAdapter.java:182)
07-03 15:40:59.978: E/AndroidRuntime(887):  at android.widget.Gallery.makeAndAddView(Gallery.java:745)
07-03 15:40:59.978: E/AndroidRuntime(887):  at android.widget.Gallery.fillToGalleryRight(Gallery.java:697)
07-03 15:40:59.978: E/AndroidRuntime(887):  at android.widget.Gallery.trackMotionScroll(Gallery.java:372)
07-03 15:40:59.978: E/AndroidRuntime(887):  at android.widget.Gallery$FlingRunnable.run(Gallery.java:1366)
07-03 15:40:59.978: E/AndroidRuntime(887):  at android.os.Handler.handleCallback(Handler.java:587)
07-03 15:40:59.978: E/AndroidRuntime(887):  at android.os.Handler.dispatchMessage(Handler.java:92)
07-03 15:40:59.978: E/AndroidRuntime(887):  at android.os.Looper.loop(Looper.java:123)
07-03 15:40:59.978: E/AndroidRuntime(887):  at android.app.ActivityThread.main(ActivityThread.java:4627)
07-03 15:40:59.978: E/AndroidRuntime(887):  at java.lang.reflect.Method.invokeNative(Native Method)
07-03 15:40:59.978: E/AndroidRuntime(887):  at java.lang.reflect.Method.invoke(Method.java:521)
07-03 15:40:59.978: E/AndroidRuntime(887):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
07-03 15:40:59.978: E/AndroidRuntime(887):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
07-03 15:40:59.978: E/AndroidRuntime(887):  at dalvik.system.NativeStart.main(Native Method)

您的問題很簡單:一次顯示太多圖像。

您的解決方案可以通過許多不同的方式來完成:)

您可以像Google Play一樣,僅顯示一些圖像,當用戶“靠近”它們時下載新圖像,然后慢慢從內存中丟棄舊圖像。 也可以是下一頁按鈕等,以加載下一張圖像。

通常,避免顯示過多的位圖,並記住要回收/丟棄/舊的位圖(通常系統會為您執行此操作,但清單不長等)。

編輯 :您可以查看支持庫提供的google lru緩存。 以下鏈接說明了lru緩存的工作方式以及有關位圖使用的其他非常重要的事情: link

但是整個主題實際上很難正確完成;(我建議您研究一下Google貨架樣本 (這很難理解,但是如果您能進行管理,那么您將學到很多東西)。

將lru緩存與僅在需要時獲取圖像(在getview / bindview等中)一起使用可能對您有用。

暫無
暫無

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

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