lateinit属性未尽快分配值? TcpService.kt TcpClient.kt

问题描述

我的代码在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)
        }
    }