我正在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()
上卡住,尽管在连接上定义了超时。我可以轻松解决这个问题,还是应该采用不同的方法来处理这个问题?