当前位置:  开发笔记 > Android > 正文

如何触发一次,只有一次...?

如何解决《如何触发一次,只有一次?》经验,为你挑选了2个好方法。

我经常只想触发一次某个函数,但我需要从另一个被反复调用的函数中触发它.例如,拍摄某些内容的快照供以后使用.我通常通过设置全局布尔值来实现.

我想知道我这样做是否真的是最好的方式?

我似乎记得读过全局变量是坏的,全局布尔变量更糟糕!

无论如何,这就是我通常只完成一次触发某个方法的方法:

在我的初始变量集中......

private var myStatus:Boolean = false;

然后,在经常被调用的函数内...

if (!myStatus) {
    doMyFunction();
    myStatus = true;
}

对我来说这似乎是合乎逻辑的,但它是正确的吗?

更新:嗯,基于我从你的答案中学到的东西,而不是检查一个全局布尔变量,我现在首先检查XML节点是否存在(我在将任何写入磁盘之前将图像存储在XML结构中),以及如果没有,那么我附加一个带有base64编码图像数据的新节点.我仍然设置一个布尔标志,以便稍后我可以用用户编辑的图像数据覆盖空白图像(如果需要).它完美地运作.感谢大家的帮助!

我现在对在某些情况下使用该特定(线程不安全)系统感到更舒服.



1> rojoca..:

当你调用一个函数时,它应该按你所期望的那样对你提供的参数做.如果你以完全相同的方式调用函数两次,你应该期望该函数给你相同的结果或做同样的事情.

将此一次调用依赖项移动到多次调用函数的逻辑可能更好.如果您只需要调用该函数一次,则只需调用一次.或者,将不同的参数传递给函数以指示您正在执行不同的操作.



2> Ned Batcheld..:

这真的取决于你的意思.如果您的代码将从多个线程调用,那么您有一个竞争条件,这可能意味着doMyFunction可以多次调用.这是因为多个线程可以检查myStatus,看到它是假的,然后调用doMyFunction.您可以通过先设置变量来稍微改善一下情况:

if (!myStatus) {
    myStatus = true;
    doMyFunction();
}

但这只会缩小窗口的问题,并不能消除它.

要消除竞争条件,您需要锁定.

推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有