- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我很好奇这种方法的安全性,我曾考虑使用这种方法在我的 Android 应用程序中传递触摸事件(并测试我对 Java 并发性的理解)。这是基础知识:
我有一个连接到 SurfaceHolder.Callback 的 SurfaceView 以获取用户输入事件,主要是 onTouchEvent
回调。调用 onTouchEvent
方法后,我查看是否 event.getAction() == MotionEvent.ACTION_UP
,如果是,则调用我命名为 postTouchEvent< 的方法
这是我的应用程序线程的成员方法,用于更新应用程序的状态并绘制到 Canvas 。
表面 View
@Override
public boolean onTouchEvent(final MotionEvent event)
{
mAppThread.postTouchEvent(event);
}
应用线程
private volatile MotionEvent mInputEvent;
public void postTouchEvent(final MotionEvent event)
{
this.mInputEvent = event;
}
@Override
public void run()
{
// while loop ...
if (this.mInputEvent != null)
{
final MotionEvent inputEvent = this.mInputEvent;
this.mInputEvent == null;
// update state based on inputEvent (not this.mInputEvent)
}
// draw to canvas
}
现在我明白了,它肯定不是原子的,但是既然我从框架接收到它后就把它当作不可变的,这行不行? (而不是同步 post 方法和 if 语句,我这样做没有问题,但我要求学习。)
这是我的想法。我知道我将有一个对该对象的有效引用,但我不确定我实际看到该对象的状态。虽然测试一切正常,但我知道线程异常是多么不常见,即使出现问题也是如此。
此外,我还可以看到一个问题:如果另一个 MotionEvent 出现,则 run()
方法中的 inputEvent 可能会被设置为与在以下情况下引用的事件不同的事件this.mInputEvent != null
已检查,但这确实不是问题。
那么,有什么我遗漏的吗?或者为了我的目的,这应该没问题吗?
最佳答案
不,这不安全,但不是出于您可能期望的原因。
ViewRoot.java, line 1841 .这是将您的 MotionEvents 分发到 View 层次结构中的代码。第 1841 行是调用 recycle()
的 finally
block 的一部分在刚刚调度的 MotionEvent 上。
MotionEvents 不会像大多数对象一样被垃圾收集,它们被合并和回收以避免在事件调度期间不必要的内存分配和垃圾收集。回收 MotionEvent 将其返回到对象池,以便稍后在需要新的 MotionEvent 时再次使用。在 recycle()
被调用后,MotionEvent 应该被认为是无效的。
您的示例代码可能最终会读取一个 MotionEvent 对象,该对象已被框架重用,现在包含完全不同的数据。
如果您计划在 onTouchEvent
返回后挂起 MotionEvent,请使用 MotionEvent.obtain(event)
克隆它.静态obtain()
方法将从对象池中返回一个内容相同的新MotionEvent。
当您处理完您自己obtain()
将其返回到池中的 MotionEvent 时,您应该调用 recycle()
。如果您忘记了这一步,这没什么大不了的,它会变成普通的 Java 垃圾,并且框架会在需要时创建新的 MotionEvents。但是,系统可以非常快速地调度 MotionEvents,以配合这种优化可以对某些设备的性能产生重大影响。
关于java - volatile 引用是在线程之间传递 MotionEvents 的安全方式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3137270/
我有一个 PowerBI Online 数据集,它是在 PowerBI 桌面中创建然后在线发布的。到目前为止,一切都很好。 我通过 PowerBI pusblish 从 Excel 连接到数据集,按预
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 2 年前。
我必须对一些太大而无法放入内存的数据训练分类模型,我正在使用 scikit learn 和 pandas 来进行分析。所以这是我的问题,如何在在线学习管道中使用验证来调整超参数? 我使用带有chuck
我正在开发一个应用程序,该应用程序将从 webservice 获取数据和图像并将其存储在设备中以供离线使用。同时,应用程序会将一些数据存储在 sqlite db 中,并将一些图像作为默认数据。 这是应
是否可以使用 FileReader API 和 onprogress 事件访问随 HTML5 传入的数据? 如果是这样,是否有 MD5 或其他快速散列算法的“在线”版本,以便我可以在文件完全读取之前开
希望任何人都可以帮助我更改下面的代码,我的临时文件包含以下代码: Temp=8.4* Humidity=70.4% 代替代码 Temp = 24 *C, Hum = 40 % 适用于以下脚本。 我需
我必须创建一个功能类似于联系人应用程序的应用程序。您可以在客户的 iPhone 上添加一个联系人,它应该会上传到客户的 iPad 上。如果客户在他们的 iPad 上更新联系人,它应该会在他们的 iPh
在 gitlab.com 上审查 merge 请求时,有时我必须在完成 merge 之前进行 rebase。 在 gitlab 上按“Rebase”后,我有一个特定的管道步骤失败,因为它无法验证用户的
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 9年前关闭。 Improve this q
我正在尝试在 azure 上托管 SQL 服务器以与节点应用程序进行通信。我已经成功地完成了创建数据库服务器和数据库本身的过程。现在,我想编辑我的数据库结构。据我发现online ,应该有一种方法可以
我在 Quickbooks Intuit 开发人员 API 中使用 Oauth 2 获得了访问 token 。 范围是 com.intuit.quickbooks.accounting 我能够使用 Q
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
是否可以使Angular Material progress spinner与文本并大致与字符的大小一致地显示? 我想要类似的东西: please wait 微调器仅与“请稍候”文本成行出现。 这可
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我有一个每天运行的Powershell脚本。今天它失败了,因为我正在使用的域 Controller 不可用。在继续执行脚本的其余部分之前,我想确保可以连接到可用的DC。 $LdapServer = "
我想制作一款在线 Flash 游戏,它将具有社交功能,但游戏玩法将主要是单人游戏。例如,屏幕上不会同时出现两个玩家,社交互动将通过异步消息进行,不会有实时聊天或其他任何内容。大部分逻辑将发生在客户端中
这几天我开始在线玩OpenShift。我部署了一个非常简单的“Hello World”Java 示例(1 行代码!),没有任何依赖项(没有 Spring!)命令行是这样的: oc.exe new-a
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
所以我一直在网上学习Java(初学者),并且我一直在尝试制作一个用于制作矩形的类文件。但是,我的在线 java 评估器指出它找不到实例变量。 This is the comment on it.我的代
我是一名优秀的程序员,十分优秀!