[英]How to add a delay inside the Executor bound to CameraX's analyzer?
在我覆蓋的analyze()
中,我需要在執行 IO 操作之前添加某種限制。 沒有節流閥,這個操作在每次調用analyze()
時立即執行並且它實際上很快完成,但顯然調用太快了一段時間后相機預覽永遠凍結(應用程序仍在運行,因為 Logcat 不斷顯示新的消息)。
我目前正在調查它是否與我的代碼有關,例如忘記調用imageProxy.close()
。 到目前為止,一切似乎都很好,恐怕執行 IO 操作的設備引發了太多中斷,CPU 無法處理,或者類似的事情。
我已經嘗試過舊的Thread.sleep()
但顯然它會阻塞主線程並凍結 UI; 我看過一些Handler#postDelayed()
的例子,但我認為它沒有達到我想要的效果; 我已經嘗試將 IO 調用包裝在一個開頭帶有delay()
的協程中,但我再次認為它沒有達到我想要的效果。 基本上我想在Executor
線程本身上調用某種形式的sleep()
,從它執行的代碼中。
一段時間后,相機預覽會永久凍結
我已經多次看到此問題發生,通常是由於Analyzer
未關閉圖像。 即使不使用圖像分析用例,您是否也看到了問題?
我已經嘗試過舊的 Thread.sleep() 但顯然它阻塞了主線程並凍結了 UI
為什么? 如果您在Analyzer.analyze()
中添加對Thread.sleep()
的調用,則不應出現這種情況,因為它會阻塞您在調用ImageAnalysis.setAnalyzer()
時提供的Executor
的線程,這應該' t 綁定到主線程。
減少執行分析次數的一種選擇是將圖像放入Analyzer
中,如下所示:
private static final int ANALYSIS_DELAY_MS = 1_000;
private static final int INVALID_TIME = -1;
private long lastAnalysisTime = INVALID_TIME;
public void analyze (ImageProxy image) {
final long now = SystemClock.uptimeMillis();
// Drop frame if an image has been analyzed less than ANALYSIS_DELAY_MS ms ago
if (lastAnalysisTime != INVALID_TIME && (now - lastAnalysisTime < ANALYSIS_DELAY_MS)) {
image.close();
}
lastAnalysisTime = now;
// Analyze image
image.close();
}
還有一種方法,這就是我在本地項目中的做法。 因此,在我的圖像分析器中,我使用 Handler#PostDelayed 重新綁定相機,這會在預覽中顯示一個小黑屏,但它不會那么快地處理下一張圖像。
我的用例是我必須連續掃描條形碼,但是掃描速度太快並且一直在多次掃描一個代碼。 所以,我只需要 100 毫秒的等待時間。 所以這對我有用。
try {
cameraProvider.unbindAll()
Handler(Looper.getMainLooper()).postDelayed({
cameraProvider.bindToLifecycle(
this, CameraSelector.DEFAULT_BACK_CAMERA, useCaseGroup.build())
}, 100)
}
catch(exc: Exception) {
Log.e(TAG, "Use case binding failed", exc)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.