【已解决】Android java.lang.RuntimeException: Parcelable encountered IOException writing

最近在写移动变成开发的课程设计,是一个关于音乐播放器的。这里设计到一个需求,在播放音乐的时候,要获取到播放列表,我们要通过intent来传递这个列表,我这里是偷懒了,直接传过去了一个List< MusicEntity >过去,但是呢,他就报错了
java.lang.RuntimeException: Parcelable encountered IOException writing……
根据提示,是说明我的MusicEntity没有实现序列化,那好,我就去实现Serializable接口,然后屁颠屁颠跑去测试,然后 what the f**k 还是报错,又是上面那个错误
java.lang.RuntimeException: Parcelable encountered IOException writing……
经过一顿查找之后,发现这个问题出现的原因就是我们的实体类不单单要实现Serializable,他的子类属性也要实现Serializable接口
我寻思着我没有用上其他的属性啊,都是八大基本类型的数据类型,
然后我看到了头像的类型Bitmap,会不会是这个狗东西的原因?
口吐芬芳
然后又一顿百度,果然就是这个的问题,但是Bitmap不是我们自己写的,我们不能实现序列化啊,这怎么办呢?

首先我们来看一下我们的实体类吧

package com.example.experimentmusicplayer.entity;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Parcel;
import android.os.Parcelable;

import java.io.ByteArrayOutputStream;
import java.io.Serializable;

/**
 * @author weirdo 
 * @version 1.0
 * @date 2020-05-12 9:35
 */
public class MusicEntity implements Serializable {

    private static final long serialVersionUID = 8604494830368708636L;
    //private byte[] bytes;
    private Bitmap pic;
    private Integer albumId;//专辑id
    private String album;//专辑名
    private String musicId;//音乐id
    private String displayName;//音乐文件名
    private String title;//歌曲名
    private Integer displayTime;//音乐时长
    private String artist;//歌手名字
    private String path;//文件路径
    private String isMusic;//是否为音乐

	/*
		这里我省略了setter和getter函数,还有构造函数
	*/
}

我记得我试过这样子转化Bitmap类型

//把bitmap变成byte数组传输
Bitmap bitmap = onlineMusicItemEntity.getPicPath();

ByteArrayOutputStream baos=new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG,100,baos);
byte[] bytes = baos.toByteArray();
intent.putExtra("bitmap",bytes);

//在另外一头用接收
byte[] bitmaps = intent.getByteArrayExtra("bitmap");
Bitmap bitmap= BitmapFactory.decodeByteArray(bitmaps,0,bitmaps.length);
picPath.setImageBitmap(bitmap);

那我是不是就意味着我可以直接用byte数组来代替Bitmap呢?等到我们要设置ImageView的时候,再转化,那我就可以再实体类上面加上这样的方法

//bitmap转byte
    public static byte[] getBytesFromBitmap(Bitmap bitmap) {
        ByteArrayOutputStream outputStream =
                new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
        return outputStream.toByteArray();
    }

    //byte转bitmap
    public static Bitmap getBitmapFromArrayBytes(byte[] bytes){
        return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
    }

    public Bitmap getPic(){
        return getBitmapFromArrayBytes(this.bytes);
    }

    public void setPic(Bitmap bitmap){
        this.bytes=getBytesFromBitmap(bitmap);

    }

于是我们就可以这样写实体类了

package com.example.experimentmusicplayer.entity;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Parcel;
import android.os.Parcelable;

import java.io.ByteArrayOutputStream;
import java.io.Serializable;

/**
 * @author weirdo 
 * @version 1.0
 * @date 2020-05-12 9:35
 */
public class MusicEntity implements Serializable {

    private static final long serialVersionUID = 8604494830368708636L;
    private byte[] bytes;
    private Integer albumId;//专辑id
    private String album;//专辑名
    private String musicId;//音乐id
    private String displayName;//音乐文件名
    private String title;//歌曲名
    private Integer displayTime;//音乐时长
    private String artist;//歌手名字
    private String path;//文件路径
    private String isMusic;//是否为音乐

    //bitmap转byte
    public static byte[] getBytesFromBitmap(Bitmap bitmap) {
        ByteArrayOutputStream outputStream =
                new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
        return outputStream.toByteArray();
    }

    //byte转bitmap
    public static Bitmap getBitmapFromArrayBytes(byte[] bytes){
        return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
    }

/*这里我保留了堆pic的setter和getter方法,做了一点点封装改变,
毕竟之前的代码写了那么多了,不能让他们发现代码已经改变了
在set的时候,其实就是堆byte类型的复制
在get的时候,调用函数转化成为Bitmap
这样外部函数就不知道他已经不是原来的那个他了*/
    public Bitmap getPic(){
        return getBitmapFromArrayBytes(this.bytes);
    }

    public void setPic(Bitmap bitmap){
        this.bytes=getBytesFromBitmap(bitmap);
    }
}

然后我们在传递List< MusicEntity >的时候,这样子做

//这样子传送
intent.putExtra("music", (Serializable) list);

//在intent的另外一端这样接受
List<MusicEntity> list= (List<MusicEntity>) 
						intent.getSerializableExtra("music");

这样就不会报错了,至于还有一种方法是实现另外一个接口Parcelable,我就没有深入去了解了,主要是看不懂重写的方法什么的,懒得去弄了,你们感兴趣的话,可以去看一下:
序列化和bitmap序列化

以上就是踩的坑了,这里记录一下,也为后来遇到这个问题的人提供解决问题的方法,希望对你有用
音乐播放器实验代码放GitHub上了,大家多多支持,还在代码更新中
github:https://github.com/WeirdeQL/MusicPlayer

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值