繁体   English   中英

Java Android Studio:在其自己的侦听器中更改View的属性

[英]Java Android studio: change an attribute of a View inside its own listener

我对Android Studio有疑问:

我有一个图像视图。 我们称之为ImageView。 我用一个侦听器new View.OnclickListener()在此ImageView上调用方法setOnCLickListener 在此侦听器的onClick()方法中,我更改了此imageView的属性(颜色,图像本身...)。 例如,我使用imageView.setImageResource(R.drawable.new_image)更改图像。 然后,我用Thread.sleep(10000)等待10秒。 然后,我使用imageView.setImageResource(R.drawable.previous_image)设置前一个图像。

这是我的问题:

我希望ImageView将其图像更改10秒钟,然后再恢复之前的图像。 但是,我看不到此ImageView的任何更改。 我只看到第一张图片...有人可以解释一下为什么吗?

我希望我已经足够清楚了...谢谢您的帮助:) !!

R.id.drawable.previous_image ?。 它应该是R.drawable.previous_image

首先,您应该阅读《 进程和线程》指南,以了解线程在Android上的工作方式。

如果做完了,您将了解您所做的事情确实很糟糕,因为您冻结了主(UI)线程,这意味着应用程序将在10秒钟后才响应任何事件。 这也会导致ANR (应用程序无响应)对话框,这是非常糟糕的 UX。

您基本上需要将等待时间委托给另一个线程(或至少一个队列),然后在时间到时,返回UI线程并设置所需的任何view属性。 有很多方法可以实现此目的,您应该阅读与UI线程通信以了解更多详细信息。 这只是一个简单的示例:

Handler handler = new Handler(Looper.getMainLooper());
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        // write here what you want to happen in 10 seconds on the UI thread
    }
}, 10000); // 10s = 10,000ms

这里有一些注意事项:

  1. 将您在此处创建的Runnable保存到变量中,因为如果用户在10秒内离开此屏幕,它仍将在其中运行代码,这可能会导致各种异常。 在这种情况下,您需要通过调用handler.removeCallbacks(runnable);从处理程序中删除该Runnable handler.removeCallbacks(runnable); 当用户离开屏幕时。
  2. 不要在每次click事件发生时创建新的Handler实例。 ActivityonCreate(...)方法中创建它,并在屏幕的其余部分使用该实例。
  3. 可以创建不带Looper参数的Handler ,该参数将为当前线程的Looper创建处理程序,现在就可以了,因为它是在UI线程上创建的。 但是,我认为最好向您展示更安全的方法,因为您可能最终在后台线程上执行类似的操作,如果您还不了解线程,可能会导致意外行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM