![](/img/trans.png)
[英]How to create a Checkbox object in Android Studio with its own Action Listener
[英]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
这里有一些注意事项:
Runnable
保存到变量中,因为如果用户在10秒内离开此屏幕,它仍将在其中运行代码,这可能会导致各种异常。 在这种情况下,您需要通过调用handler.removeCallbacks(runnable);
从处理程序中删除该Runnable
handler.removeCallbacks(runnable);
当用户离开屏幕时。 Handler
实例。 在Activity
的onCreate(...)
方法中创建它,并在屏幕的其余部分使用该实例。 Looper
参数的Handler
,该参数将为当前线程的Looper
创建处理程序,现在就可以了,因为它是在UI线程上创建的。 但是,我认为最好向您展示更安全的方法,因为您可能最终在后台线程上执行类似的操作,如果您还不了解线程,可能会导致意外行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.