在 MainActivity 中.java有一个 ImageView 数组。这个想法是在条件和延迟 1200 毫秒后更改图像。当单击图像并同时延迟在单独的线程中运行时,要更改的图像的更新以意外的方式更改,猜是因为错误在安多利德中使用线程。
尝试在Andorid中做一个简单的记忆游戏。如果选择了两张不同的卡,希望在延迟后显示"背面",而不是这些卡的"正面"。
例如:如果在延迟时点击了 3 张卡片,更新了错误的卡。例如,卡片:0,1,2在短时间内被点击。0 和 1 图像需要更改。但是图像1,2实际上被更改了。
尝试检查值 - 看起来在线程外部有延迟 -使用预期值进行更新。在线程内部它没有。
在主活动中.java -
public void hidecards() {
Handler ha = new Handler();
Runnable rn = new Runnable() {
@Override
public void run() {
ivcardsarr[clicked_cards[0]].setImageResource(R.drawable.cardback);
ivcardsarr[clicked_cards[1]].setImageResource(R.drawable.cardback);
}
}; ha.postDelayed(rn, 1200);
}
此方法按其名称(hidecards(((调用。
我试图将其更改为延迟或其他内容,结果都相同。
知道在这种情况下使用线程的正确方法是什么吗?谢谢。
试试这个:
public void hidecards(final ImageView cardOne, final ImageView cardTwo) {
Handler ha = new Handler();
Runnable rn = new Runnable() {
@Override
public void run() {
cardOne.setImageResource(R.drawable.cardback);
cardTwo.setImageResource(R.drawable.cardback);
}
};
ha.postDelayed(rn, 1200);
}
通过以下方式调用此函数:
hideCards(ivcardsarr[clicked_cards[0]], ivcardsarr[clicked_cards[1]]);
为什么使用局部变量:
当您将数组作为字段传递时,实质上是向它传递了对预期对象的引用,而不是对象本身。 因此,当您单击下一张卡片时,您更新了引用。在调用可运行对象时,您已经告诉它查看不同的对象,因此更新了新对象。通过向它传递实际对象,它会得到一个引用,当您单击新卡片时,该引用不会更改。
为什么Java坚持在内部类中使用最终变量
这本质上是参考不会混淆。最后,它最终不会产生巨大的差异,因为您无论如何都不打算重新定义变量。您可以通过构建一个包含 getter 和 setter 的子类或使用全局变量来解决此问题。