gpt4 book ai didi

java - 与 Android 线程、Handler 和 HandlerThreads 的并发

转载 作者:行者123 更新时间:2023-12-02 09:28:55 27 4
gpt4 key购买 nike

好的。因此,我正在使用 Camera2 API 并尝试在后台处理所有工作,以便 UI 能够响应。我已经实现了一个 HandlerThread 和一个处理程序来将任务放入其中,如下所示:

    private void startBackgroundThread(){
backgroundHandlerThread = new HandlerThread("BackgroundThread");
backgroundHandlerThread.start();
backgroundHandler = new Handler(backgroundHandlerThread.getLooper());
}

然后我像这样发布可运行文件:

    backgroundHandler.post(new ImageSaver(reader.acquireLatestImage()));

问题是我对发布的每个可运行程序使用相同的处理程序(backgroundHander),并且遇到了一些严重的性能问题。这告诉我,我没有正确执行并发操作,但在查看文档几个小时后,我无法找到这些类的正确用法。正确的做法是什么?

  • 为我在 HandlerThread 中发布的每个可运行对象创建多个处理程序?
  • 为每种类型的可运行对象创建多个 HandlerThread?

提前致谢,尽量不要对我太严厉,因为我对此很菜鸟。

最佳答案

每个HandlerThread有一个Looper它为线程运行消息循环。每个 Looper 都有一个 MessageQueue它保存发送到 Looper 的消息列表。消息和 Runnables 通过 Handler 发送到 MessageQueue 。每一个消息从消息队列出来时都会被执行。这个过程阻碍了您实现“真正的”并发。

ExecutorService可以在这里工作。 ExecutorService 允许提交和执行多个 Runnable。从上面的代码 fragment 来看,您似乎正在使用 HandlerThread 将工作置于主线程或 UI 线程的后台。如果您不尝试将工作或其结果转发回主线程,则常规线程和 ExecutorService 也可以工作。

举个例子

...
Executor executor = Executors.newFixedThreadPool(numThreads);
executor.submit(new ImageSaver(reader.acquireLatestImage()));
// submit Runnables as needed
executor.shutdownNow(); // VERY IMPORTANT OR YOU WILL CREATE A MEMORY LEAK!
...

如果您需要与 UI 线程进行通信,则需要提供 ExecutorService 接口(interface)的实现,如 ExecutorService 中的示例。其文档的使用示例部分。

关于java - 与 Android 线程、Handler 和 HandlerThreads 的并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58129313/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com