与Android线程,处理程序和HandlerThreads并发

问题描述 投票:0回答:1

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

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

然后我像这样发布可运行对象:

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

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

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

预先感谢,请不要对我严厉,因为我对此很不满意。

java android concurrency handler
1个回答
0
投票

每个HandlerThread都有一个Looper,该线程为该线程运行一个消息循环。每个Looper都有一个MessageQueue,其中包含要发送到Looper的消息列表。消息和可运行对象由Handler发送到MessageQueue。当每个消息从消息队列中出来时,它们都会被执行。此过程使您无法“真正”并发。

ExecutorService可以在这里工作。 ExecutorService允许提交和执行多个Runnable。从上面的代码片段看来,好像您是在使用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接口的实现,如其文档的ExecutorService使用示例部分中的示例。

© www.soinside.com 2019 - 2024. All rights reserved.