gpt4 book ai didi

android - HandlerThread 优于其他类似类的最佳使用

转载 作者:IT老高 更新时间:2023-10-28 13:16:06 26 4
gpt4 key购买 nike

我试图了解使用 HandlerThread 的最佳用例。

根据定义:

"Handy class for starting a new thread that has a looper. The looper can then be used to create handler classes. Note that start() must still be called."

我可能错了,但我可以通过使用 ThreadLooperHandler 实现类似的功能。那么什么时候应该使用HandlerThread?举个例子会很有帮助。

最佳答案

这是一个真实的例子,HandlerThread变得得心应手。当您注册相机预览帧时,您会在 onPreviewFrame() 回调中收到它们。 documentation说明 此回调是在事件线程 open(int) 被调用时调用的

通常,这意味着回调将在主 (UI) 线程上调用。因此,处理庞大的像素数组的任务可能会在打开菜单、动画动画甚至在屏幕上打印统计数据时卡住。

简单的解决方案是创建一个 new HandlerThread() 并将 Camera.open() 委托(delegate)给这个线程(我是通过 post(Runnable) 完成的,你不需要实现Handler.Callback)。

请注意,相机的所有其他工作都可以照常完成,您不必将 Camera.startPreview()Camera.setPreviewCallback() 委托(delegate)给处理线程。为了安全起见,我等待等待实际的 Camera.open(int) 完成,然后再继续主线程(或用于调用的任何线程 Camera.open() 更改前)。


所以,如果你从代码开始

try {
mCamera = Camera.open(1);
}
catch (RuntimeException e) {
Log.e(LOG_TAG, "failed to open front camera");
}
// some code that uses mCamera immediately

首先将其按原样提取到私有(private)方法中:

private void oldOpenCamera() {
try {
mCamera = Camera.open(1);
}
catch (RuntimeException e) {
Log.e(LOG_TAG, "failed to open front camera");
}
}

而不是调用 oldOpenCamera() 只需使用 newOpencamera():

private void newOpenCamera() {
if (mThread == null) {
mThread = new CameraHandlerThread();
}

synchronized (mThread) {
mThread.openCamera();
}
}
private CameraHandlerThread mThread = null;
private static class CameraHandlerThread extends HandlerThread {
Handler mHandler = null;

CameraHandlerThread() {
super("CameraHandlerThread");
start();
mHandler = new Handler(getLooper());
}

synchronized void notifyCameraOpened() {
notify();
}

void openCamera() {
mHandler.post(new Runnable() {
@Override
public void run() {
oldOpenCamera();
notifyCameraOpened();
}
});
try {
wait();
}
catch (InterruptedException e) {
Log.w(LOG_TAG, "wait was interrupted");
}
}
}

请注意,如果您不访问 mCamera,则整个 notify() -- wait() 线程间通信是不必要的打开后立即在原始代码中。

更新:这里将相同的方法应用于加速度计:Acclerometer Sensor in Separate Thread

关于android - HandlerThread 优于其他类似类的最佳使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18149964/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com