最近在写移动变成开发的课程设计,是一个关于音乐播放器的。这里设计到一个需求,在播放音乐的时候,要获取到播放列表,我们要通过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