0

我的代码在 10,000 次中有 9,999 次有效。但是,大约每 10,000 次,应用程序崩溃到 aUninitializedPropertyAccessException这是有问题的,因为大约有 20,000~30,000 台 Android 设备使用我的代码在生产中。

有时,lateinit变量的实际分配似乎并没有很快发生(因此导致上述异常)。

有没有其他人有类似的问题?你的解决方案是什么?

TcpService.kt

类 TcpService:服务(){
    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")
    }

    // ...

}
4

2 回答 2

0

啊它发生在我身上一次,我浪费了一整天然后我解决了它(仍然不知道如何)但是你为什么不先做mTcpClient空然后再做空检查:

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

类似的东西我不是专业人士抱歉

于 2020-09-20T18:59:31.757 回答
0

您可以在属性isInitialized上使用方法:lateInit

    when (intent.action) {
        if (::mTcpClient.isInitialized) { ACTION_SEND_MESSAGE ->
          mTcpClient.sendMessageAsync(intent.getStringExtra(EXTRA_NEW_MESSAGE)
        }
    }
于 2020-09-20T20:08:43.040 回答