我在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 reference
和read
上获得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)
}
}
}
答案 0 :(得分:0)
我将ColourBoardScreenShot
更改为以下内容:
@Parcelize
data class ColourBoardScreenShot(var screenshot: ByteArray) : Parcelable
因此我使用@RawValue BitmapDrawable
代替ByteArray
而停止了崩溃。