簡體   English   中英

與 Android 線程、處理程序和處理程序線程的並發性

[英]Concurrency with Android Thread, Handler and HandlerThreads

好的。 所以我正在使用 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 中發布的每個可運行文件創建多個處理程序?
  • 為每種類型的可運行對象創建多個 HandlerThread?

在此先感謝並盡量不要對我苛刻,因為我對此很陌生。

每個HandlerThread都有一個Looper ,它為線程運行一個消息循環。 每個 Looper 都有一個MessageQueue ,它保存着發送到 Looper 的消息列表。 消息和 Runnable 由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使用示例部分中的示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM