代码之家  ›  专栏  ›  技术社区  ›  Cruces

如何创建在不同线程上运行的回调处理程序?

  •  0
  • Cruces  · 技术社区  · 6 年前

    我正在尝试创建一个 Handler 它将在自己的线程上处理消息

    我目前正在做的是在 onCreate 活动的一部分此代码:

    lateinit var _handler: Handler
    lateinit var hThread: HandlerThread
    
    fun setUpHandler() {
        hThread = HandlerThread("HandlerThread")
        hThread.start()
        _handler = Handler(hThread.looper, this::callback)
    }
    

    问题是,即使我使用不同线程的循环器,回调也会在UI线程上运行。

    我通过运行创建此方法来测试它:

    fun callback(msg: Message): Boolean {
        Log.d("Handler", "got message ${msg.what} in thread main? ${Looper.myLooper() == Looper.getMainLooper()}")
        return true
    }
    

    当我这样称呼它时:

    _handler.dispatchMessage(Message.obtain(_handler, 1))
    

    我得到:

    Handler: got message 1 in thread main? true
    

    但是当我这样运行它时:

    Handler(hThread.looper).post {
        val msg = Message.obtain()
        msg.what = 2
        callback(msg)
    }
    

    我收到这个消息:

    Handler: got message 2 in thread main? false
    

    我目前使用第二种方法,但出于好奇,有没有办法使第一种方法起作用?

    作为一个附带问题,正在运行 hThread.quit() 在活动的 onDestroy 方法足以终止我启动的额外线程,还是必须执行其他操作?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Mercato    6 年前

    如上所述 here 这个 dispatchMessage 函数运行 Message 通过 callback 在任何线程上调用函数…所以,既然您从UI线程调用它,它就会出现在这里。

    也就是FYI 调度消息 不是真的被使用,因为它破坏了使用 Handler 并将其连接到 Thread 在这里完美地展示了。

    quit() 终止 Looper 它本质上终止了无限 while 循环有效,保持 HandlerThread “活”在它的 run() 方法,所以是的,它应该足以杀死 螺纹 本身。但是,要注意 消息 Runnable 当前已执行的将不会停止,以及所有其他 Messages Runnables MessageQueue 活套 不会执行。