runOnUiThread не взаимодействует с интерфейсом

Пишу приложение на Андроид, которое берет с сервера данные и исходя из них прорисовывает экран. Но после обращения к интерфейсу через поток, в котором идет взаимодействие с сервером, на экране ничего не меняется. Чтоб убедиться, что проблема не со стороны сервера, сократил код до нижеописанного. На экране изменений после запуска потока по прежнему нет. Без использования потока данный код работает. Подскажите, пожалуйста, в чем может быть проблема? Заранее спасибо!

fight_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/area"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="Fight">


    <ImageView
        android:id="@+id/left"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/control_fone"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

Fight.kt

class Fight : Activity() {
    var adress ="192.168.1.109"
    var port = 8080
    
    lateinit var game_screen: ConstraintLayout

    @ExperimentalStdlibApi
    @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_fight)
        game_screen=findViewById<ConstraintLayout>(R.id.area)
     
        thread { ClientHandler(adress, port, this).run() }
    }
}

class ClientHandler(adress: String, port: Int, a: Fight) : Runnable {
        val socket = Socket(adress, port)
        val dout = DataOutputStream(socket.getOutputStream())
        val inputStream = socket.getInputStream()
        val activity = a

        override fun run() {
            activity.runOnUiThread(Runnable(){
                    var left= activity.findViewById<ImageView>(R.id.left)//left fone
                        left.layoutParams = (ViewGroup.LayoutParams((1000), (300 )))
                        left.layout(0, 0, 1000, 300)
                        left.setScaleType(ImageView.ScaleType.FIT_XY)

                    var new_view= ImageView(activity)
                        new_view.setScaleType(ImageView.ScaleType.FIT_XY)
                        new_view.setImageDrawable(activity.getDrawable(R.drawable.control_fone))
                        new_view.layoutParams = (ViewGroup.LayoutParams(width, height ))
                        new_view.layout(0, 0, width, height)
                    activity.game_screen.addView(new_view)
          }
}

Ответы (1 шт):

Автор решения: Vadik

По всей видимости 192.168.1.109:8080 не отвечает и вы не дожидаетесь таймаута. Попробуйте уменьшить таймаут, создав Socket без параметров:

val socket = Socket()
socket.connect(InetSocketAddress(address, port), 3000) // таймаут 3 секунды

Если через 3 секунды не удастся подключиться к указанному адресу, то в логах будет ошибка SocketTimeoutException.

→ Ссылка