问题描述
我的代码在10,000次中可以运行9,999次。但是,大约每10,000次应用程序崩溃到UninitializedPropertyAccessException
,这是有问题的,因为大约有20,000〜30,000个Android设备正在生产我的代码。
有时候,lateinit
变量的实际赋值还没有足够快地发生(因此导致了上面的异常)。
还有其他人有类似的问题吗?您有什么解决方案?
Tcpservice.kt
Tcpservice类:Service(){ private lateinit var mTcpClient: TcpClient
override fun onCreate() {
registerReceiver(object: broadcastReceiver() {
override fun onReceive(context: Context,intent: Intent) {
when(intent.action) {
// This will cause an Uninitialized Property Exception 1 in 10,000 times
ACTION_SEND_MESSAGE -> mTcpClient.sendMessageAsync(intent.getStringExtra(EXTRA_NEW_MESSAGE)
}
}
},IntentFilter(ACTION_SEND_MESSAGE)
})
}
override fun onStart() {
mTcpClient = mTcpClient()
}
// ...
}
TcpClient.kt
class TcpClient() {
init {
// ...
sendbroadcast(Intent(ACTION_SEND_MESSAGE).putExtra(EXTRA_NEW_MESSAGE,"Message Contents")
}
// ...
}
解决方法
啊,它发生在我身上一次,我浪费了一整天,然后我解决了(仍然不知道如何),但是为什么不把mTcpClient
设为null,然后再设为null,则检查:
`when(intent.action) {
// This will cause an Uninitialized Property Exception 1 in 10,000 times
ACTION_SEND_MESSAGE ->{
if(mTcpClient != null){
mTcpClient.sendMessageAsync(intent.getStringExtra(EXTRA_NEW_MESSAGE)
}else{
mTcpClient=mTcpClient()
mTcpClient.sendMessageAsync(intent.getStringExtra(EXTRA_NEW_MESSAGE)
}
}
}`
像这样的事情我不是专业的对不起
,您可以在isInitialized
属性上使用lateInit
方法,而不是使属性为null,然后使null检查变得有些危险:
when (intent.action) {
if (::mTcpClient.isInitialized) { ACTION_SEND_MESSAGE ->
mTcpClient.sendMessageAsync(intent.getStringExtra(EXTRA_NEW_MESSAGE)
}
}