将drawable对象转为json遇到的坑

20 篇文章 0 订阅

         要持久化存储一个对象,需要先将对象转化为字节流,我使用的是谷歌的gson,如图对含有Drawable的实体对象转string时,会在转化的时候报转化异常。

        在onCreate()方法中使用gson.toJson转化AppEntity对象:

        报错:占用大量资源,崩溃,转化失败。

原因:实际上转化AppEntity实例报错是因为在转化Drawable的时候失败;

解决方法:可以在存Drawable的时候先将Drawable对象转化为String类型存入,取该Drawable对象的时候将其从String类型转化回Drawable,即在AppEntity中将Drawable类型改为String类型。

转化Drawable<-->String方法:

    //将drawable转化成字符串
    public synchronized void setImage(Drawable drawable) {
        if (drawable != null) {
            Bitmap bitmap = Bitmap
                    .createBitmap(
                            drawable.getIntrinsicWidth(),
                            drawable.getIntrinsicHeight(),
                            drawable.getOpacity() != PixelFormat.OPAQUE ? 
                             Bitmap.Config.ARGB_8888
                                    : Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(bitmap);
            drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
                    drawable.getIntrinsicHeight());
            drawable.draw(canvas);
            int size = bitmap.getWidth() * bitmap.getHeight() * 4;

            // 创建一个字节数组输出流,流的大小为size
            ByteArrayOutputStream baos = new ByteArrayOutputStream(size);
            // 设置位图的压缩格式,质量为100%,并放入字节数组输出流中
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
            // 将字节数组输出流转化为字节数组byte[]
            byte[] imagedata = baos.toByteArray();

            this.image = Base64.encodeToString(imagedata, Base64.DEFAULT);
        }

    }
    //将字符串转化成Drawable
    public synchronized Drawable getImage() {
        if (image == null || image.length() < 10)
            return null;
        byte[] img = new byte[0];
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.FROYO) {
            img = Base64.decode(image.getBytes(), Base64.DEFAULT);
        }
        Bitmap bitmap;
        if (img != null) {
            bitmap = BitmapFactory.decodeByteArray(img, 0, img.length);
            @SuppressWarnings("deprecation")
            Drawable drawable = new BitmapDrawable(bitmap);

            return drawable;
        }
        return null;
    }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值