Тема за кнопкой в ​​Android и Kotlin - PullRequest
0 голосов
/ 28 февраля 2019

Я хочу запустить поток после нажатия кнопки во фрагменте, я сделал это так:

btn!!.setOnClickListener {
        activityCallback!!.runOnUiThread(Runnable {

            Thread.sleep(10000)

            Toast.makeText(
                context,
                "Done", Toast.LENGTH_LONG
            ).show()
        })
}

но после нажатия кнопки все элементы блокируются до истечения времени и ничего не работает

как мне запустить поток после нажатия кнопки без блокировки?

спасибо

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

Вы можете просто использовать сопрограмму для достижения этой цели.Поскольку потоки обычно дороги, сопрограмма является более легким способом создания потоков.Для вопроса, мы должны сделать две вещи

1) Вы должны не блокировать поток без блокировки

2) Тост должен быть показан в потоке пользовательского интерфейса

btn!!.setOnClickListener {
      GlobalScope.launch {
         delay(10000L)
         withContext(Dispatchers.Main){
             Toast.makeText(context,"Done", Toast.LENGTH_LONG).show()
         }
   }
}

Таким образом, в приведенном выше коде

1) GlobalScope.launch - запускает рабочий поток диспетчера и задерживает выполнение на 10000 мс, используя delay(10000L)

2), как только задержка будет выполнена, мыснова переключаетесь на основной поток с помощью withContext(Dispatchers.Main){ и отображаете тост внутри него.

0 голосов
/ 28 февраля 2019

Простой подход - использовать Handler с задержкой.пожалуйста, найдите код ниже

btn!!.setOnClickListener{
    Handler().postDelayed({
        Toast.makeText(context,"Done", Toast.LENGTH_LONG).show()
    },10000L) // delays the execution for 10s

} 
0 голосов
/ 28 февраля 2019

Проблема

Выполнение Thread.sleep(10000) внутри runOnUiThreadHandler().post) заблокирует пользовательский поток.

Решение

Вместо runOnUiThread необходимо использовать Thread класс.

button9.setOnClickListener {
            Thread {
                Thread.sleep(10000)
                runOnUiThread(Runnable { Toast.makeText(this@DebugActivity, "Done", Toast.LENGTH_LONG).show() })
            }.start()
        }

Как это работает?

  1. Выполнить Thread.sleep(10000) внутри Thread {}.start()
  2. Выполнить Toast.makeText(...).show() в runOnUiThread, потому что для показа тоста необходим пользовательский интерфейс.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...