如果没了解 Parcelable 建议自行了解再回来看该篇文章
直接进入主题,我们都知道,Kotlin有自己的空检测机制,那么对于一些实体类我们有个默认的构造函数,如下:
class Album internal constructor(
var id: String,
var coverUri: Uri,
var displayName: String,
var count: Long
)
逻辑上已经确保了该实体的参数是不会为null的,所以当调用这些参数时是不需要使用 !! ?! 等等
但是,如果需要实现 Parcelable,就会空警告,如下:
class Album internal constructor(
val id: String,
var coverUri: Uri,
var displayName: String,
var count: Long
) : Parcelable {
constructor(parcel: Parcel) :
this(parcel.readString()!!,
parcel.readParcelable(Uri::class.java.classLoader)!!,
parcel.readString()!!,
parcel.readLong())
}
大家可以看到,用!!方式解决,如果返回null就抛出异常,但是我们知道构造函数已经杜绝了null,所以肯定不会返回null的,所以使用!!
使用Parcelize简洁代码
- 升级Kotlin Gradle plugins和Android Studio plugin到1.3.60以上
- 在项目里面的build.gradle内添加如下:
plugins {
id 'com.android.library'
id 'kotlin-android'
// 插件提供的其他特性,@Parcelize、View binding and caching
id 'kotlin-android-extensions'
}
- 或者只需要 @Parcelize特性,如下:
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-parcelize'
}
- 然后直接加入
@Parcelize
注解即可,如下:
@Parcelize
class Album internal constructor(
val id: String,
var coverUri: Uri,
var displayName: String,
var count: Long
) : Parcelable {}
非常简洁的代码不用管create
和write
了,这个注解在后面都生成了相关代码
如果需要更高级的序列化逻辑
那么就需要在伴生类中重写了,代码直接如下:
/**
* 专辑
* @author zhihu
*/
@Parcelize
class Album internal constructor(
val id: String,
var coverUri: Uri,
var displayName: String,
var count: Long
) : Parcelable {
constructor(parcel: Parcel) :
this(parcel.readString()!!,
parcel.readParcelable(Uri::class.java.classLoader)!!,
parcel.readString()!!,
parcel.readLong())
companion object : Parceler<Album> {
override fun create(parcel: Parcel): Album {
return Album(parcel)
}
override fun Album.write(parcel: Parcel, flags: Int) {
parcel.writeString(id)
parcel.writeParcelable(coverUri, 0)
parcel.writeString(displayName)
parcel.writeLong(count)
}
}
}
欢迎star
一个非常丰富的开源库,如果你需要相册、录制、录音等操作,那么这个也许对你有一定的帮助:
zhongjhATC/AlbumCameraRecorder: 🔥一个高效的多媒体支持操作库,可多方面的简单配置操作相册、拍照、录制、录音等功能。也支持配套使用的展示图片、视频、音频的九宫格功能。 (An efficient multimedia support operation library, can be a variety of simple configuration operation album, photo, recording, recording and other functions.Also support supporting the use of the display of pictures, video, audio of the nine grid function.) (github.com)