如何在延迟后更新 ImageView(图像),而不会冻结 UI 并允许用户单击



在 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 的子类或使用全局变量来解决此问题。

最新更新