gpt4 book ai didi

android - android相机和线程安全问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:05:49 32 4
gpt4 key购买 nike

正如 Android documentation on handling the camera 中指出的那样,建议使用单独的线程打开相机。

好吧,我正在这样做,但确实有一些困难:

对于我的相机对象,我使用了一个全局实例变量。现在,当我启动我的应用程序时,我在 onResume() 中创建了一个单独的线程,并在该线程中为该相机对象进行所有初始化。

稍后当我离开应用程序时,我在 onPause() 中释放相机。这一切都很好。

但问题是:当我做了一些压力测试并在 onResume()onPause() 之间快速切换时(通过点击多任务按钮速度过快)我的应用程序崩溃了。原因是有一个在release()之后调用的方法

这是有道理的,因为相机可能会在 onPause() 中释放,但同时线程尚未完成其初始化。因此,该线程会尝试调用已释放的相机对象。

现在,我该怎么做才能解决这个问题?也许不使用全局相机对象?或者我怎样才能使这个线程安全?

最佳答案

您有几个选择。

选项 #1:仅从 UI 线程触摸 Camera

这非常简单,因为您可以在 onPause()onResume() 中管理相机。如果你想使用来自另一个线程的 Camera 对象,你可以只使用 runOnUiThread()。这种方法的问题是您不想在 UI 线程上做大量工作,所以您必须将预览数据发送到其他地方。

此方法用于 Grafika 中的“显示 + 捕获相机” Activity .关于线程管理有一个冗长的评论here .请注意,相机预览由 GL 渲染线程处理。

选项#2:仅从专用相机线程触摸相机

为此,您需要在每次希望它对Camera 执行某些操作时向线程发送消息。使用通常的 HandlerLooper 安排最容易做到这一点。诀窍在于,当您发送消息时,调用会立即 返回。如果您发送一条消息告诉线程从 onPause() 关闭摄像头,实际的摄像头关闭可能暂时不会发生——与此同时, Activity 正在关闭其他东西关闭,并且(如果事件发生得很快)可能会在关闭完成之前返回到 onResume() 中。 (我怀疑这就是发生在你身上的事情。)

对于启动和关闭,需要等待完成。您可以在不同的(非相机)Grafika Activity 中看到这方面的示例,其中 waits for the render thread在发送消息之前完成初始化。在线程停止时通过 join() 同步关闭。

要记住的关键是,您只能从单个线程调用 Camera 方法——无论您用来打开相机的线程是唯一接触该实例的线程。之后就是并发管理的“简单”事情了。 (严格来说,doc 说“绝不能同时从多个线程调用此类的方法”,因此如果仔细序列化访问,您可以使用多个线程。序列化访问的最简单方法是只从一个线程进行调用。)

关于android - android相机和线程安全问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22271685/

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