2015-05-12 33 views
7

我想弄清楚哪些線程應該在Android中做什麼。Android相機:線程?哪個應該做什麼

我在官方文檔中發現的唯一的事情是,camera.open()應該放在它自己的線程中。

什麼:

  • camera.startPreview()
  • camera.stopPreview()
  • camera.release()

這並不說明他們需要哪個線程。它們必須在主線程(ui線程)上運行嗎?或者我可以自由選擇?

爲什麼我想弄明白這一點? camera.startPreview()當在主線程上運行時會導致我的應用程序在短時間內抖動/滯後,這會嚴重影響我的應用程序,因爲它放在viewPager中,我不希望相機總是預覽(這會導致沒有滯後,但佔用系統資源)。

任何想法?

回答

3

Camera的文檔聲明該類不是線程安全的,應該一次從多個線程調用而不是(我想,除非您正在執行自己的同步)。

它說,回調將被傳遞到線程,使呼叫open

從參考(重點煤礦):

這個類不是線程安全的,是意味着從一個事件線程使用。大多數長時間運行的操作(預覽,焦點,照片捕捉等)都是異步發生的,並根據需要調用回調。回調將在事件線程open(int)被調用時調用。絕不能一次從多個線程調用這個類的方法。

open(int)方法參考:

從其它方法回調被輸送到線程的事件循環,要求打開()。如果此線程沒有事件循環,則回調將傳遞到主應用程序事件循環。如果沒有主應用程序事件循環,則不傳遞迴調。

小心:在某些設備上,此方法可能需要很長時間才能完成。最好從工作者線程調用此方法(可能使用AsyncTask)以避免阻塞主應用程序UI線程。

需要線程它是你用來調用open(int)之一。

所以要回答你的問題,是的,你可以自由選擇,但你必須保持一致。

+0

Bravo,所以我是正確的,然後使用HandlerThread來處理*所有*相機操作。添加到原始問題; SurfaceView和SurfaceHolder.Callbacks怎麼樣?在我的測試中,回調函數是在主線程上創建的,所以我必須使用HandlerThread來處理這些(回調函數)? –

+0

@KarlMorrison你當然可以委託,但這些工具所做的假設是運行'SurfaceView'的線程是處理回調的線程。引用狀態:_「當從運行SurfaceView的線程中使用此接口時,您需要仔細閱讀lockCanvas()和Callback.surfaceCreated()方法。」_ –

相關問題