[英]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都有一個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.