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

时间:2017-07-30 16:00:05

标签: java android view onclicklistener

我对Android Studio有疑问:

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

这是我的问题:

我希望ImageView将其图像更改为10秒,然后将之前的图像恢复。但是,我看到这个ImageView没有变化。我只看到第一张图片......有人可以解释一下原因吗?

我希望我足够清楚......提前感谢您的帮助:) !!

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

首先,您应该阅读Processes and Threads指南,了解线程如何在Android上运行。

如果您已完成此操作,您将了解您所执行的操作非常糟糕,因为您冻结了主(UI)线程,这意味着应用程序在10秒之前不会响应任何事件通过。这也会导致ANR(应用程序无响应)对话框非常糟糕 UX。

您基本上需要将等待期间委托给另一个线程(或至少是一个队列),然后在时机成熟时,返回UI线程并设置您想要的任何视图属性。有很多方法可以实现这一点,您应该阅读Communicating with the UI Thread了解更多详情。这里只是一个简单的样本:

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秒内离开此屏幕,它仍将运行代码,这可能会导致各种异常。在这种情况下,您需要在用户离开屏幕时通过调用Runnable从处理程序中删除handler.removeCallbacks(runnable);
  2. 每次点击事件发生时都不要创建新的Handler实例。使用Activity onCreate(...)方法创建它,并在屏幕的其余部分使用该实例。
  3. 可以创建Handler而没有Looper参数,这将为当前线程Looper创建处理程序,这将是现在很好,因为它是在UI线程上创建的。但是,我认为最好向您展示更安全的方式,因为如果您还不了解线程,最后可能会在后台线程上执行类似操作,这可能会导致意外行为。