Инициализация объекта Kotlin заблокирована присоединением к обсуждению - PullRequest
0 голосов
/ 27 мая 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...