Почему я запускаю Runnable в основной поток, но Runnable был выполнен в HandlerThread? - PullRequest
0 голосов
/ 10 мая 2019

Это код с проблемами:

object MainThreadPoster : Handler(Looper.getMainLooper()) {

    fun postRunnableAtFixRate(runnable: Runnable, token: Any, delay: Long, period: Long) {
        postAtTime(object : Runnable {
            override fun run() {
                runnable.run()
            }
        }, token, SystemClock.uptimeMillis() + delay)
    }

}

MainThreadPoster инициализируется с помощью mainLooper, поэтому ожидается, что запускаемая функция (в методе postRunnableAtFixRate) будет выполняться в главном потоке, но проблема в том, что когда-нибудь выполняемая функция может быть выполнена в HandlerThread.

Это ожидаемая трассировка стека This is the expected stack trace

Это трассировка стека с проблемой This is the stack trace with problem

1 Ответ

0 голосов
/ 10 мая 2019

Не вызывайте Message.recycle () в вашем коде. В Android 4.4, если вы вызываете Message.recycle () несколько раз, сообщение будет появляться в пуле сообщений несколько раз, и сообщение может одновременно существовать в очереди нескольких сообщений。

это документ:

class MainActivity : AppCompatActivity() {
    private val mMainHandler = Handler(Looper.getMainLooper())
    private lateinit var mSubHandler: Handler

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)


        btn_test.setOnClickListener {
            start()
        }

        val handlerThread = HandlerThread("sub thread")
        handlerThread.start()
        mSubHandler = Handler(handlerThread.looper)
    }

    private fun start(){
        val message = Message()
        message.recycle()
        message.recycle()

        mMainHandler.postDelayed({
            if(Looper.myLooper() != Looper.getMainLooper()){
                throw Exception("should run in main thread")
            }

            start()
        }, 100)

        mSubHandler.sendEmptyMessage(1)
    }
}
...