我对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没有变化。我只看到第一张图片......有人可以解释一下原因吗?
我希望我足够清楚......提前感谢您的帮助:) !!
答案 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
以下是一些注意事项:
Runnable
保存到变量中,因为如果用户在10秒内离开此屏幕,它仍将运行代码,这可能会导致各种异常。在这种情况下,您需要在用户离开屏幕时通过调用Runnable
从处理程序中删除handler.removeCallbacks(runnable);
。Handler
实例。使用Activity
onCreate(...)
方法创建它,并在屏幕的其余部分使用该实例。Handler
而没有Looper
参数,这将为当前线程Looper
创建处理程序,这将是现在很好,因为它是在UI线程上创建的。但是,我认为最好向您展示更安全的方式,因为如果您还不了解线程,最后可能会在后台线程上执行类似操作,这可能会导致意外行为。