Я пишу приложение для 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()
несмотря на определение времени ожидания при подключении.Могу ли я легко решить эту проблему или мне следует использовать другой подход к этому объекту?