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

我们怎么从遗嘱执行人那里弄到活套?

  •  1
  • CommonsWare  · 技术社区  · 4 年前

    谷歌关于绑定服务的文档正在推广 using a Messenger in lieu of your own custom binding for IPC . 所以,我想试试 a particular experiment that I am running .

    然而,一个 信息员 需要一个 Handler 处理程序 需要一个 Looper ,在这个场景中,我可能希望有一个用于后台线程(而不是 Looper.getMainLooper() ). 唯一的另一个 活套 run() HandlerThread 找一个 活套 从它那里。

    the deprecated non- Looper forms of the Handler constructor 拥有:

    在处理程序构造期间隐式地选择一个循环器可能会导致错误,其中操作会自动丢失(如果处理程序不需要新任务并退出)、崩溃(如果处理程序有时是在没有活动循环器的线程上创建的)或争用条件,其中处理程序关联的线程不是作者预期的。 相反,使用执行器或显式指定循环器,使用Looper#getMainLooper、View#getHandler或类似的方法。

    (重点补充)

    这仅仅是一个措辞奇怪的文档,或者如果有一个获得 绑在一个 Executor 我好像找不到?

    0 回复  |  直到 4 年前
        1
  •  1
  •   Diego Marcher    4 年前

    更新:TL;DR

    // Check if this thread already has prepared a looper
    if (Looper.myLooper() == null) {
        Looper.prepare()
    }
    val threadHandler = Handler(Looper.myLooper())
    val messenger = Messenger(threadHandler)
    messenger.send(...)
    

    冗长的回答

    如果您想更深入地了解正在发生的事情以及每段代码都在哪个线程中运行:

    // Check if this thread already has prepared a looper
    // Running on Original Thread
    if (Looper.myLooper() == null) {
        Looper.prepare()
    }
    // Save thread's Looper (1)
    // Running on Original Thread
    val threadLooper = Looper.myLooper()
    Handler(Looper.getMainLooper()).post {
        // Do some UI stuff, for instance, show a dialog
        // Running on UI Thread
        AlertDialog
            .Builder(context)
            .setTitle("Dialog title")
            .setMessage("Dialog message")
            .setNegativeButton("Cancel") { _: DialogInterface, _: Int ->
                // Use thread's Looper from (1) to notify the original thread
                // Running on UI Thread
                Handler(threadLooper).post {
                    // Running on Original Thread
                    callback?.onCancel()
                }
            }
            .setPositiveButton("Retry") { _: DialogInterface, _: Int ->
                // Use thread's Looper from (1) to notify the original thread
                // Running on UI Thread
                Handler(threadLooper).post {
                    // Running on Original Thread
                    callback?.onRetry()
                }
            }
            .show()
    }
    // Call loop() to start the thread's loop
    // Running on Original Thread
    Looper.loop()
    
        2
  •  1
  •   tynn    4 年前

    我想他们的意思是建议使用 Executor 而不是 Handler . 我什么都不知道 遗嘱执行人 Looper .

    处理程序 ],使用 遗嘱执行人 或指定 活套 显式地,使用 Looper#getMainLooper , View#getHandler ,或类似产品。

    当您只需要运行 Runable . 例如 CameraManager.openCamera() 方法获得了API级别为28的重载。

    此方法的行为与 openCamera(java.lang.String, StateCallback, android.os.Handler) ,除了它使用 作为论据而不是 处理程序

    Messenger ,您必须始终提供 Hanlder 活套 ,已由解决 Looper.getMainLooper() , Looper.myLooper() HandlerThread .

    活套 然后跑 loop() 在上面。但这基本上是 手螺纹 做。