2017-08-15 53 views
0

我把Parcelable對象Intent下一個ActivityIllegalStateException異常:parcel.readString()不能爲空

val intent = Intent(mContext, ShowTestActivity::class.java) 
intent.putExtra("test", test) 
Log.d("myLog", "${intent.getParcelableExtra<Test>("test")}") // No problem 
mContext.startActivity(intent) 

而得到這個對象在明年Activity

if (!intent.hasExtra("test")) throw Exception("Intent doesn't has 'test' extra") 
val test: Test = intent.getParcelableExtra("test") 

這裏都扔例外:

public open class QBase(): Parcelable { 
    ... 
    protected constructor(parcel: Parcel?) : this() { 
     parcel?.let { 
      question = parcel.readString() // parcel.readString() must not be null 
      helpText = parcel.readString() 
      qValue = parcel.readDouble() 
      qType = QType.valueOf(parcel.readString()) 
     } 
    } 
    override fun writeToParcel(parcel: Parcel, flags: Int) { 
     parcel.writeString(question) 
     parcel.writeString(helpText) 
     parcel.writeDouble(qValue) 
     parcel.writeString(qType.name) 
} 
    ... 
} 

並在測試中:

public class Test(): Parcelable { 
    ... 
    public var questions: ArrayList<QBase> = ArrayList() 

    constructor(parcel: Parcel?): this() { 
     parcel?.let { 
     ... 
     parcel.readTypedList(questions, QBase.CREATOR) 
     } 
    } 

    override fun writeToParcel(p: Parcel?, p1: Int) { 
     p?.let { 
      ... 
      it.writeTypedList(questions) 
     } 
    } 
    ... 
} 

它是一個例外:

所致:java.lang.IllegalStateException:parcel.readString()絕不能以com.vadim.hasdfa.justlearn.Model.Questions空 。 utils.QBase。(QBase.kt:22) at com.vadim.hasdfa.justlearn.Model.Questions.utils.QBase $ CREATOR.createFromParcel(QBase.kt:70) at com.vadim.hasdfa.justlearn.Model .Questions.utils.QBase $ CREATOR.createFromParcel(QBase.kt:68) at android.os.Parcel.readTypedList(Pa (Test.kt:28) at com.vadim.hasdfa.justlearn.Model.Test $ CREATOR.createFromParcel(Test.kt:47 ) at com.vadim.hasdfa.justlearn.Model.Test $ CREATOR.createFromParcel(Test.kt:45) at android.os.Parcel.readParcelable(Parcel.java:2787) at android.os.Parcel.readValue (Parcel.java:2681) at android.os.Parcel.readArrayMapInternal(Parcel.java:3048) at android.os.BaseBundle.unparcel(BaseBundle.java:257) at android.os.BaseBundle.containsKey(BaseBundle .java:435) at android.content.In tent.hasExtra(Intent.java:6859) at com.vadim.hasdfa.justlearn.Controller.Activity.BrowseTest.ShowTestActivity.onCreate(ShowTestActivity.kt:28) at android.app.Activity.performCreate(Activity.java: 6980) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) at android.app.ActivityThread.-wrap11(Unknown Source:0) at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1593) at andr oid.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6540) at java。 lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote $ MethodAndArgsCaller.run(Zygote.java:240) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java :767)

+0

您可以在獲取對象之前在'ShowTestActivity'中添加'Intent intent = getIntent();'。 – KeLiuyue

+0

在kotlin'intent'中表示Java中的getIntent()' – Hasdfa

+0

哦,對於我在科特林的窮人抱歉。 – KeLiuyue

回答

0

基於answer - 目前唯一的解決方法是使實現parcelable的類的成員可以爲空。

相關問題