美文网首页
Android:BitmapFactory.decodeStre

Android:BitmapFactory.decodeStre

作者: Lee坚武 | 来源:发表于2021-06-23 11:03 被阅读0次
    最近在写安卓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的内存优化

    相关文章

      网友评论

          本文标题:Android:BitmapFactory.decodeStre

          本文链接:https://www.haomeiwen.com/subject/czxbyltx.html