如果沒了解 Parcelable 建議自行了解再回來看該篇文章
直接進入主題,我們都知道,Kotlin有自己的空檢測機制,那么對于一些實體類我們有個默認的構(gòu)造函數(shù),如下:
class Album internal constructor(
var id: String,
var coverUri: Uri,
var displayName: String,
var count: Long
)
邏輯上已經(jīng)確保了該實體的參數(shù)是不會為null的,所以當調(diào)用這些參數(shù)時是不需要使用 !! ?! 等等
但是,如果需要實現(xiàn) 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就拋出異常,但是我們知道構(gòu)造函數(shù)已經(jīng)杜絕了null,所以肯定不會返回null的,所以使用!!
使用Parcelize簡潔代碼
- 升級Kotlin Gradle plugins和Android Studio plugin到1.3.60以上
- 在項目里面的build.gradle內(nèi)添加如下:
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了,這個注解在后面都生成了相關(guān)代碼
如果需要更高級的序列化邏輯
那么就需要在伴生類中重寫了,代碼直接如下:
/**
* 專輯
* @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)