我需要继续运行一个线程,该线程使用来自android设备的相机的帧进行图像处理。
我试过最简单的方法
new Thread() {
@Override
public void run() {
while (true) {
/* Processing frames here */
}
}
}.start();
但这会过多地占用 CPU,并且 UI 开始滞后。此外,Thread.sleep(300)
在处理帧之后添加,以便 UI 线程可以获得一些 CPU 时间,但尽管它确实在一定程度上有所帮助,但感觉不是正确的方法。
我想对处理这个问题的好方法有一些想法。
编辑:使用AsyncTask
private DetectionTask detectionTask;
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
/* Doing some stuff here */
camera.addCallbackBuffer(data);
if (detectionTask != null && detectionTask.getStatus() != AsyncTask.Status.FINISHED)
return;
detectionTask = new DetectionTask();
detectionTask.execute();
}
private class DetectionTask extends AsyncTask<Void, Void, float[]> {
@Override
protected float[] doInBackground(Void... params) {
/* Processing frames here */
return result;
}
@Override
protected void onPostExecute(float[] result) {
if (result != null) {
/* Update UI */
}
};
};