Почему мой код не отображает интерфейс или вообще не работает?

#kotlin

Вопрос:

После добавления цикла while с условием true (для бесконечного цикла) интерфейс (кнопки) даже не отображается при запуске в эмуляторе. С чем это может быть связано? Как это можно исправить? Это первый раз, когда я создаю приложение (для своего API умного дома).

 class MainActivity : AppCompatActivity() {  lateinit var webview: WebView  override fun onCreate(savedInstanceState: Bundle?) {  super.onCreate(savedInstanceState)  setContentView(R.layout.activity_main)   webview = findViewById(R.id.browser)   MyThread().start()  }   inner class MyThread : Thread() {  override fun start() {  super.start()  while (true) {  runOnUiThread {  updateWebView()  }  sleep(60000L)  }  }  }  private fun updateWebView() {  webview.loadUrl("https://api.site.com/?action=statusamp;device_osversion=${Build.VERSION.SDK_INT}amp;device_release=${Build.VERSION.RELEASE}amp;device_device=${Build.DEVICE}amp;device_model=${Build.MODEL}")  } }  

Ответ №1:

Если вы хотите создать новый поток в Kotlin/Java, вы должны не переопределять start() , а run() функционировать. run() является «телом» нити. start() используется для планирования запуска потока.

В результате вы на самом деле не запустили свой цикл внутри MyThread . Он был выполнен в основном потоке, заблокировав его на неопределенный срок.

Кроме того, имейте в виду, что этот поток будет выполняться даже после закрытия действия. Каждый раз, когда вы открываете MainActivity новый поток, начнется утечка ресурсов.

Комментарии:

1. Ну, я попытался понять, как решить мою проблему. Итак, я переоделся start() в run() . Теперь у меня есть интерфейс, но webview все еще не работает. inner class MyThread : Thread() { override fun run() { super.run()

2. Вы пытались вызвать loadUrl() непосредственно из onCreate() , чтобы посмотреть, работает ли это? Возможно, проблема не связана с потоком.