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 шт):
По всей видимости 192.168.1.109:8080 не отвечает и вы не дожидаетесь таймаута. Попробуйте уменьшить таймаут, создав Socket без параметров:
val socket = Socket()
socket.connect(InetSocketAddress(address, port), 3000) // таймаут 3 секунды
Если через 3 секунды не удастся подключиться к указанному адресу, то в логах будет ошибка SocketTimeoutException.