【发布时间】: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
}
}
【问题讨论】: