简体   繁体   English

AndroidRuntime:java.lang.OutOfMemoryError

[英]AndroidRuntime: java.lang.OutOfMemoryError

I am trying to load all the images in image view but after 12 images the application crashes with out of memory 我正在尝试在图像视图中加载所有图像,但是在12张图像后,应用程序崩溃并出现内存不足的情况

I tried to recycle the bitmap but it fails with unable to reuse bitmap canvas 我试图回收位图,但由于无法重用位图画布而失败

Here is my code 这是我的代码

public void LoadImageArray() {
        Bitmap mybitmap;
        LinearLayout layout = (LinearLayout) findViewById(R.id.image_container);
        //LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(100,100);
        String path= Environment.getExternalStorageDirectory().toString()+"/Pictures";
        File f=new File(path);
        File file[]=f.listFiles();
        BitmapFactory.Options options=new BitmapFactory.Options();
        for (int i = 0; i < 13; i++) {
            layoutParams.setMargins(1, 1, 1, 1);
            layoutParams.gravity = Gravity.LEFT;
            ImageView imageView = new ImageView(this);

            int imageHeight = options.outHeight;
            int imageWidth = options.outWidth;

            String imageType=options.outMimeType;
            if(imageWidth > imageHeight) {
                options.inSampleSize = calculateInSampleSize(options,100,100);//if landscape
            } else{
                options.inSampleSize = calculateInSampleSize(options,100,100);//if portrait
            }
            options.inJustDecodeBounds = false;
            //Bitmap
            try {
                File efile=new File(file[i].getAbsolutePath());
                if(efile.exists()) {
                    mybitmap = BitmapFactory.decodeFile(file[i].getAbsolutePath(), options);


                    imageView.setLayoutParams(layoutParams);
                    imageView.setImageBitmap(mybitmap);
                    imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
                    imageView.setPadding(1, 1, 1, 1);
                    imageView.setColorFilter(34);
                    imageView.setClickable(true);

                    if (mybitmap != null) {
                        layout.addView(imageView);
                       // if (!((BitmapDrawable) imageView.getDrawable()).getBitmap().isRecycled()) {
                       //     ((BitmapDrawable) imageView.getDrawable()).getBitmap().recycle();
                      //  }
                    }
                    //else {layout.addView(imageView);}
                    Log.d("Files", file[i].getName());              
                }
            } catch(Exception e) {Log.d("TAG","Error is " +e);}
        }
    }

your not using the options correctly first you make options then set inJustDecodeBounds to true then call decode file on it then you do the rest how you have it, but use these in a row right after you make your options like this 您没有正确使用选项,首先创建选项,然后将inJustDecodeBounds设置为true,然后在其上调用解码文件,然后按其他方式进行操作,但是在像这样创建选项后立即使用它们

public void LoadImageArray() {
    Bitmap mybitmap;
    LinearLayout layout = (LinearLayout) findViewById(R.id.image_container);
    //LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
    LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(100,100);
    String path= Environment.getExternalStorageDirectory().toString()+"/Pictures";
    File f=new File(path);
    File file[]=f.listFiles();

    for (int i = 0; i < 13; i++) {
         BitmapFactory.Options options = new BitmapFactory.Options();
         options.inJustDecodeBounds = true;
         BitmapFactory.decodeFile(file[i].getAbsolutePath(), options);

        layoutParams.setMargins(1, 1, 1, 1);
        layoutParams.gravity = Gravity.LEFT;
        ImageView imageView = new ImageView(this);

        int imageHeight = options.outHeight;
        int imageWidth = options.outWidth;

        String imageType=options.outMimeType;
        if(imageWidth > imageHeight) {
            options.inSampleSize = calculateInSampleSize(options,100,100);//if landscape
        } else{
            options.inSampleSize = calculateInSampleSize(options,100,100);//if portrait
        }
        options.inJustDecodeBounds = false;
        //Bitmap
        try {
            File efile=new File(file[i].getAbsolutePath());
            if(efile.exists()) {
                mybitmap = BitmapFactory.decodeFile(file[i].getAbsolutePath(), options);


                imageView.setLayoutParams(layoutParams);
                imageView.setImageBitmap(mybitmap);
                imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
                imageView.setPadding(1, 1, 1, 1);
                imageView.setColorFilter(34);
                imageView.setClickable(true);

                if (mybitmap != null) {
                    layout.addView(imageView);
                   // if (!((BitmapDrawable) imageView.getDrawable()).getBitmap().isRecycled()) {
                   //     ((BitmapDrawable) imageView.getDrawable()).getBitmap().recycle();
                  //  }
                }
                //else {layout.addView(imageView);}
                Log.d("Files", file[i].getName());              
            }
        } catch(Exception e) {Log.d("TAG","Error is " +e);}
    }
}

java android android-imageview 标签android android-imageview栏目Java

I would suggest to use libraries like Picasso or Glide to handle your bitmaps. 我建议使用像PicassoGlide这样的库来处理您的位图。 They already do all this heavy lifting for you in the most efficient manner possible. 他们已经以最有效的方式为您完成了所有这些繁重的工作。

add bitmap.recycle(); 添加bitmap.recycle(); try this : 尝试这个 :

public void LoadImageArray() {
    Bitmap mybitmap;
    LinearLayout layout = (LinearLayout) findViewById(R.id.image_container);
    //LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
    LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(100,100);
    String path= Environment.getExternalStorageDirectory().toString()+"/Pictures";
    File f=new File(path);
    File file[]=f.listFiles();
    BitmapFactory.Options options=new BitmapFactory.Options();
    for (int i = 0; i < 13; i++) {
        layoutParams.setMargins(1, 1, 1, 1);
        layoutParams.gravity = Gravity.LEFT;
        ImageView imageView = new ImageView(this);

        int imageHeight = options.outHeight;
        int imageWidth = options.outWidth;

        String imageType=options.outMimeType;
        if(imageWidth > imageHeight) {
            options.inSampleSize = calculateInSampleSize(options,100,100);//if landscape
        } else{
            options.inSampleSize = calculateInSampleSize(options,100,100);//if portrait
        }
        options.inJustDecodeBounds = false;
        //Bitmap
        try {
            File efile=new File(file[i].getAbsolutePath());
            if(efile.exists()) {
                mybitmap = BitmapFactory.decodeFile(file[i].getAbsolutePath(), options);


                imageView.setLayoutParams(layoutParams);
                imageView.setImageBitmap(mybitmap);
                imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
                imageView.setPadding(1, 1, 1, 1);
                imageView.setColorFilter(34);
                imageView.setClickable(true);

                if (mybitmap != null) {
                    layout.addView(imageView);
                    mybitmap.recycle();// added
                   // if (!((BitmapDrawable) imageView.getDrawable()).getBitmap().isRecycled()) {
                   //     ((BitmapDrawable) imageView.getDrawable()).getBitmap().recycle();
                  //  }
                }
                //else {layout.addView(imageView);}
                Log.d("Files", file[i].getName());              
            }
        } catch(Exception e) {Log.d("TAG","Error is " +e);}
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM