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

标签 android kotlin exception parcelable onsaveinstancestate

我有一个实现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()
        }
    }

当我运行应用程序时,出现以下错误:elset块类型不匹配的java.lang.IllegalStateException: savedInstanceState.getPa…eArrayList(KEY_QUES_LIST) must not be null第一行。另外,当我将鼠标指针悬停在此行时,它显示:
Required:
ArrayList<Question>
Found:
ArrayList<Question!>?

列表声明:private lateinit var list: ArrayList<Question>
问题类
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)
    }
}

}

最佳答案

在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)
        }

关于android - 从SavedInstanceState获取自定义类型的列表时获取IllegalStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62369005/

相关文章:

c# - 从 C# .NET Windows 应用程序调用 C++ dll 时出现运行时错误

C++ std::库之间的异常

android - 将已解析的 Json 数据更新到 Listview

android - PrintManager.print() 并更改了 attachBaseContext 中的语言环境

exception - 当您的应用程序在演示过程中抛出异常时,最好的防御是什么?

android - 如何为 Marvel Api 请求发送时间戳和 md5 哈希

android - 第二个 maven-repository 被忽略

android - 如何在android中改变音频的音调而不改变其持续时间(节奏,速度)?

java - Android - Firebase - 保存新数据而不覆盖旧数据

java - 在android上解密php加密数据