通过Thread上的连接阻止Kotlin对象初始化

时间:2018-05-27 20:11:11

标签: android multithreading sockets object kotlin

我正在Kotlin编写一个Android应用程序,它将成为我的团队开发的服务器的客户端。我想创建一个对象Connection,它将存储有关与服务器的套接字连接的所有必要数据:

object Connection {
    const val HOST = "host_name" // in project it is well defined
    const val PORT = 52137
    const val TIMEOUT = 5000

    val socket: Socket = Socket()

    /* ... */

    val connectData = MutableLiveData<String>()
    val errorData = MutableLiveData<String>()

    init {
        val connect = Thread({
            val address = InetSocketAddress(HOST, PORT)
            socket.connect(address, TIMEOUT)
        })
        connect.uncaughtExceptionHandler = Thread.UncaughtExceptionHandler({ t, e ->
            e.printStackTrace()
        })
        connect.start()
        connect.join()
        /*
        some more data processing
        */
    }
    /*
    some functions
    */
}

我使用join()以便我可以完全初始化我的套接字。但是,当我在应用程序中创建主活动时,此对象的初始化会卡在connect.join()上。这是代码:

class LoginActivity: AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)

        Connection.connectData.observe(this, Observer(this::displayConnectData))
        Connection.errorData.observe(this, Observer(this::displayError))

        val viewModel = ViewModelProviders.of(this).get(LoginViewModel::class.java)

        login_button.setOnClickListener({
            val loggedIn = viewModel.login(username.text.toString(), password.text.toString())
            if (loggedIn) {
                val intent = Intent(this, MainMenuActivity::class.java)
                startActivity(intent)
                finish()
            }
        })
    }


    private fun displayConnectData(message: String?) {
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
    }

    private fun displayError(message: String?) {
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
    }

}

我知道Kotlin中的对象是懒惰地初始化的,所以Connection对象在调用Connection.connectData.observe(this, Observer(this::displayConnectData))时开始初始化,但我不知道为什么它会在connect.join()上卡住,尽管在连接上定义了超时。我可以轻松解决这个问题,还是应该采用不同的方法来处理这个问题?

0 个答案:

没有答案