Android:BitmapFactory.decodeStre

2021-06-23  本文已影响0人  Lee坚武
最近在写安卓SDK的时候,用了线程去绘制图片,然后后面出现了OutOfMemoryError,这是因为图片太大,bitmap分配的内存又小导致的,bug显示的图片如下:
image.png
查了一下相关BitmapFactory.decodeStream的相关api的用法,然后看到了一些方法思路,我代码造成报错的源码如下:
 //子线程设置绘制图片,主线程展示(设置图片资源)
    private void initAnnouncementBgImages(final View view,final int imageId){
        new Thread(new Runnable() {
            @Override
            public void run() {
//                InputStream ins = getActivity().getResources().openRawResource(imageId);
//                BitmapFactory.Options options = new BitmapFactory.Options();
//                options.inJustDecodeBounds = true;
//                final Bitmap copybm = BitmapFactory.decodeStream(ins, null, options);
                Bitmap bitmap = BitmapFactory.decodeResource(getActivity().getResources(),imageId);
//                final Bitmap copybm = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(),bitmap.getConfig());
                final Bitmap copybm = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(), bitmap.getConfig().ARGB_8888);
                Canvas canvas = new Canvas(copybm);
                Paint paint = new Paint();
                paint.setColor(Color.RED);
                canvas.drawBitmap(bitmap, new Matrix(), paint);
                Handler mainHandler = new Handler(Looper.getMainLooper());
                mainHandler.post(new Runnable() {
                    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
                    @Override
                    public void run() {
                        Drawable drawable = new BitmapDrawable(copybm);
                        view.setBackground(drawable);
                    }
                });

//                Bitmap bitmap = null;
//                try {
//                    // 实例化Bitmap
//                    bitmap = BitmapFactory.decodeFile(path);
//                } catch (OutOfMemoryError e) {
//                    //
//                }
//                if (bitmap == null) {
//                    // 如果实例化失败 返回默认的Bitmap对象
//                    return defaultBitmapMap;
//                }
            }
        }).start();
    }
最后我的解决方法如下:就是没有对他回收机制
image.png
private void releaseBitmap (View view){
        if(view == null) return;
        BitmapDrawable bd = (BitmapDrawable)view.getBackground();
        view.setBackgroundResource(0);
//        if(bd == null) return;
//        bd.setCallback(null);
//        bd.getBitmap().recycle();

        // 先判断是否已经回收
        if(bd != null && !bd.getBitmap().isRecycled()){
            // 回收并且置为null
            bd.getBitmap().recycle();
            bd = null;
        }
        System.gc();
    }
添加了判断回收机制之后,完美解决,大家可以参考下!需要的可以添家我的维新!!!!
本文参考了:Bitmap详解与Bitmap的内存优化
上一篇 下一篇

猜你喜欢

热点阅读