Android开发Android开发Android

Kotlin 搭配 Parcelable + Parcelize

2022-03-21  本文已影响0人  zhongjh

如果没了解 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简洁代码

  1. 升级Kotlin Gradle plugins和Android Studio plugin到1.3.60以上
  2. 在项目里面的build.gradle内添加如下:
plugins {
    id 'com.android.library'
    id 'kotlin-android'
    // 插件提供的其他特性,@Parcelize、View binding and caching
    id 'kotlin-android-extensions'
}
  1. 或者只需要 @Parcelize特性,如下:
plugins {
    id 'com.android.library'
    id 'kotlin-android'
    id 'kotlin-parcelize'
}
  1. 然后直接加入@Parcelize注解即可,如下:
@Parcelize
class Album internal constructor(
    val id: String,
    var coverUri: Uri,
    var displayName: String,
    var count: Long
) : Parcelable {}

非常简洁的代码不用管createwrite了,这个注解在后面都生成了相关代码

如果需要更高级的序列化逻辑

那么就需要在伴生类中重写了,代码直接如下:

/**
 * 专辑
 * @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)

上一篇下一篇

猜你喜欢

热点阅读