【问题标题】:Parcelable encountered IOException writing serializable object Error while Sending activity instance to another activity as putExtraParcelable 在将活动实例作为 putExtra 发送到另一个活动时遇到 IOException 写入可序列化对象错误
【发布时间】:2020-10-30 13:19:33
【问题描述】:

我有一个听众说 IListener,它被声明为

interface IListener : Serializable {
     fun onPurchaseUpdated(transactionResponse: TransactionResponse)
}

其中 TransactionResponse 是 Parcelable 对象。如图:

@Parcelize
data class TransactionResponse(
    var code: Int?,
    var message: String?,
    var status: String?,
    val orderId: String? = null, 
    val txnId: String? = null,
    val amount: Double? = 0.0,
    val timestamp: String? = null,
    val startDate: String? = null,
    val endDate: String? = null,
    val skuId: Long? = 0,
    val currency: String? = null
) : Parcelable {}

我的主要活动实现了这个监听器并覆盖了 onPurchaseUpdated() 方法。从我的 MainActivity 中,我启动了另一个名为 MainActivity2 的活动,如下所示:

val intent = Intent(context, MainActivity2::class.java)
    intent.putExtra(LISTNER, iListenerInstance)
    context.startActivity(intent)

在MainActivity中获取iListenerInstance的地方如下图:

val iListenerInstance= this as IListener 

但是当我这样做时,这个应用程序崩溃并出现以下错误:

Parcelable encountered IOException writing serializable object (name = com.abc.sampleclientapp.MainActivity)

MainActivity 代码是

class MainActivity : AppCompatActivity(), IListener {
private var isAutoConfirmed = false
private var orderId: String? = null

override fun onPurchaseUpdated(transactionResponse: TransactionResponse) {
    Log.i("Abc", "transactionResponse = $transactionResponse")
    orderId = transactionResponse.orderId
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    buy.requestFocus()
}

override fun onRestoreInstanceState(savedInstanceState: Bundle) {
    super.onRestoreInstanceState(savedInstanceState)
    isAutoConfirmed = savedInstanceState.getBoolean("isAutoConfirmed")
}

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    outState.putBoolean("isAutoConfirmed", isAutoConfirmed)
}

fun buttonClicked(v: View?) {
    when (v!!.id) {

        R.id.buy_new -> {
            requestPayNewApi()
            isAutoConfirmed = false
        }
    }
}

private fun requestPayNewApi() {
    var skuId = sku_id.text.toString()
    if (skuId.isEmpty()) {
        skuId = BuildConfig.DEFAULT_SKU
    }
    val iListener = this as IListener
   val intent = Intent(context, MainActivity2::class.java)
   intent.putExtra(LISTNER, iListenerInstance)
    context.startActivity(intent)
}

private fun getUniqueOrderID(): String {
    val allowedChars = ('A'..'Z') + ('a'..'z') + (1..9)
    return (1..UNIQUE_ID_LENGTH)
        .map { allowedChars.random() }
        .joinToString("").plus(System.currentTimeMillis())
}

companion object {
    private const val UNIQUE_ID_LENGTH =
        17 // It is 27, UNIQUE_ID_LENGTH + 10 digit UNIX timestamp
}
}

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

    看起来问题是我们无法序列化活动上下文。因此,只要在侦听器中引用/声明了 Activity 或其内部类,就会抛出异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-30
      • 2020-07-22
      • 2014-08-03
      • 2013-08-11
      • 2018-01-02
      • 2016-01-25
      相关资源
      最近更新 更多