#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()
, чтобы посмотреть, работает ли это? Возможно, проблема не связана с потоком.