如果在某些时候使用了Parcelised数据,我退出应用程序时Android应用程序崩溃,即使该数据已成功分区

时间:2018-02-12 15:14:49

标签: android kotlin parcelable

我在Genymotion Android模拟器和我的Huawei Nexus 6P上都发生了一次奇怪的崩溃。我有一个截图,我正在成功发送给另一个Anko Component - 显然它是Parcelable:

@Parcelize
data class ColourBoardScreenShot(var screenshot: @RawValue BitmapDrawable) : Parcelable

但是,如果我拍摄截图并且随后通过按屏幕底部的圆形按钮退出应用程序,应用程序将崩溃并显示以下堆栈跟踪:

FATAL EXCEPTION: main
Process: uk.co.davechambers.pegboard, PID: 2292
java.lang.RuntimeException: Parcel: unable to marshal value
android.graphics.drawable.BitmapDrawable@4cdb04c
at android.os.Parcel.writeValue(Parcel.java:1477)
at uk.co.davechambers.pegboard.models.ColourBoardScreenShot.writeToParcel(ColourBoardScreenShot.kt:0)
at android.os.Parcel.writeParcelable(Parcel.java:1496)
at android.os.Parcel.writeValue(Parcel.java:1402)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:724)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1408)
at android.os.Bundle.writeToParcel(Bundle.java:1157)
at android.os.Parcel.writeBundle(Parcel.java:764)
at android.support.v4.app.FragmentState.writeToParcel(Fragment.java:154)
at android.os.Parcel.writeTypedArray(Parcel.java:1307)
at android.support.v4.app.FragmentManagerState.writeToParcel(FragmentManager.java:617)
at android.os.Parcel.writeParcelable(Parcel.java:1496)
at android.os.Parcel.writeValue(Parcel.java:1402)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:724)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1408)
at android.os.Bundle.writeToParcel(Bundle.java:1157)
at android.os.Parcel.writeBundle(Parcel.java:764)
at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:3633)
at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3773)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

谁能告诉我哪里出错?

修改

如果我尝试使用插件替换ColourBoardScreenShot来生成Parcelize代码,我会在Unresolved referenceread上获得write

data class ColourBoardScreenShot(var screenshot: @RawValue BitmapDrawable) : Parcelable {
constructor(source: Parcel) : this(
        source.read[@kotlinx.android.parcel.RawValue] BitmapDrawable ()
)

override fun describeContents() = 0

override fun writeToParcel(dest: Parcel, flags: Int) = with(dest) {
    write[@kotlinx.android.parcel.RawValue] BitmapDrawable (screenshot)
}

companion object {
    @JvmField
    val CREATOR: Parcelable.Creator<ColourBoardScreenShot> = object : Parcelable.Creator<ColourBoardScreenShot> {
        override fun createFromParcel(source: Parcel): ColourBoardScreenShot = ColourBoardScreenShot(source)
        override fun newArray(size: Int): Array<ColourBoardScreenShot?> = arrayOfNulls(size)
    }
}
}

1 个答案:

答案 0 :(得分:0)

我将ColourBoardScreenShot更改为以下内容:

@Parcelize
data class ColourBoardScreenShot(var screenshot: ByteArray) : Parcelable

因此我使用@RawValue BitmapDrawable代替ByteArray而停止了崩溃。