从SavedInstanceState获取自定义类型的列表时获取IllegalStateException

问题描述 投票:0回答:1

我有一个实现Parcelable的Question类,它充当myquiz.db和dbHelper类之间的桥梁。我要做的是在旋转设备后恢复状态。这是onSaveInstanceState()中的代码:

override fun onSaveInstanceState(outState: Bundle?, outPersistentState: PersistableBundle?) {
        super.onSaveInstanceState(outState, outPersistentState)
        outState?.putInt(KEY_SCORE, score)
        outState?.putInt(KEY_QUES_COUNT, questionCounter)
        outState?.putBoolean(KEY_ANSWERED, answered)
        outState?.putLong(KEY_MILLIS_LEFT, timeLeftInMillis)
        outState?.putParcelableArrayList(KEY_QUES_LIST, list)
    }

这是我从saveInstanceState还原列表的代码:

if (savedInstanceState == null) {
        val dbHelper = QuizDbHelper(this)
        list = dbHelper.getAllQuestions()
        totalQuestions = list.size
        list.shuffle()
        textDefaultColor = rb1.textColors
        textDefaultColorcd = timer.textColors
        nextQuestion()
    } else {
        **list = savedInstanceState.getParcelableArrayList(KEY_QUES_LIST)**
        totalQuestions = list.size
        score = savedInstanceState.getInt(KEY_SCORE)
        answered = savedInstanceState.getBoolean(KEY_ANSWERED)
        questionCounter = savedInstanceState.getInt(KEY_QUES_COUNT)
        currQuestion = list[questionCounter - 1]
        timeLeftInMillis = savedInstanceState.getLong(KEY_MILLIS_LEFT)

        if (!answered) {
            startTimer()
        } else {
            updateCoundownText()
            correctAnswer()
        }
    }

[运行应用程序时,我收到此错误:java.lang.IllegalStateException: savedInstanceState.getPa…eArrayList(KEY_QUES_LIST) must not be null else块类型不匹配的第一行。同样,当我将鼠标指针悬停在此行时,它显示:

Required:
ArrayList<Question>
Found:
ArrayList<Question!>?

列表的声明:private lateinit var list: ArrayList<Question>

Question.class

class Question() : Parcelable {
private lateinit var question: String
private lateinit var option1: String
private lateinit var option2: String
private lateinit var option3: String
private var answerNr = 0

constructor(question: String, option1: String, option2: String, option3: String, answerNr: Int) : this() {
    this.question = question
    this.option1 = option1
    this.option2 = option2
    this.option3 = option3
    this.answerNr = answerNr
}

constructor(parcel: Parcel) : this() {
    parcel.readString()
    parcel.readString()
    parcel.readString()
    parcel.readString()
    parcel.readInt()
}


fun getQuestion(): String? {
    return question
}

fun setQuestion(question: String) {
    this.question = question
}

fun getOpt1(): String? {
    return option1
}

fun setOpt1(option1: String) {
    this.option1 = option1
}

fun getOpt2(): String? {
    return option2
}

fun setOpt2(option2: String) {
    this.option2 = option2
}

fun getOpt3(): String? {
    return option3
}

fun setOpt3(option3: String) {
    this.option3 = option3
}

fun getAnswerNo(): Int {
    return answerNr
}

fun setAnswerNo(answerNr: Int) {
    this.answerNr = answerNr
}

override fun writeToParcel(parcel: Parcel, flags: Int) {
    parcel.writeString(question)
    parcel.writeString(option1)
    parcel.writeString(option2)
    parcel.writeString(option3)
    parcel.writeInt(answerNr)
}

override fun describeContents(): Int {
    return 0
}

companion object CREATOR : Parcelable.Creator<Question> {
    override fun createFromParcel(parcel: Parcel): Question {
        return Question(parcel)
    }

    override fun newArray(size: Int): Array<Question> {
        return newArray(size)
    }
}

}

android kotlin exception parcelable onsaveinstancestate
1个回答
0
投票

在onSaveInstanceState方法中,您首先调用super,然后存储状态。因此list始终为null,并且您已将列表声明为不可为null,因此将引发异常。

更新代码:

 override fun onSaveInstanceState(outState: Bundle?, outPersistentState: PersistableBundle?) {
            outState?.putInt(KEY_SCORE, score)
            outState?.putInt(KEY_QUES_COUNT, questionCounter)
            outState?.putBoolean(KEY_ANSWERED, answered)
            outState?.putLong(KEY_MILLIS_LEFT, timeLeftInMillis)
            outState?.putParcelableArrayList(KEY_QUES_LIST, list)
            super.onSaveInstanceState(outState, outPersistentState)
        }
© www.soinside.com 2019 - 2024. All rights reserved.