2017-07-30 42 views
1

我有一个关于Android Studio的问题:Java Android Studio:在其自己的收听器中更改视图的属性

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

这里是我的问题:

我期望的ImageView改变自己的形象,持续10秒,然后让前面的图像回来。但是,我发现这个ImageView没有任何改变。我只看到第一张图片...有人能解释我为什么吗?

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

+0

请发布您的代码。 – Abhi

回答

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秒内导航离开,它会仍然在里面运行代码,这可能会导致各种例外。在这种情况下,您需要在用户离开屏幕时通过调用handler.removeCallbacks(runnable);从处理程序中删除Runnable
  2. 每次发生点击事件时都不要创建新的Handler实例。在ActivityonCreate(...)方法中创建它,并在屏幕的其余部分使用该实例。
  3. 可以创建Handler没有Looper参数,这将创建当前线程的Looper的处理程序,并因为它被UI线程上创建的,将现在被罚款。不过,我决定最好还是告诉你,因为你可能最终做在后台线程可能会导致意外的行为,如果你不明白的还穿类似的东西更安全的方式。
+0

它现在正在工作...但我会继续研究这个问题! THx很明显的答案! –

3

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

+0

对不起,我的意思是R.drawable.previous_image! THx捕捉它!我刚刚编辑它! –

0

其实我很抱歉回到这个问题上,但即使您的答案是完美的,我仍然有一个问题。 我明白,让线程睡觉是一个坏主意。但是,如果我只是更改图像资源,然后经过一个循环(例如1到10000)......所以线程不会休眠......然后返回到之前的图像资源。这是不是应该让图像改变两次? (其实它不是...我已经测试过...它没有注意到图像的变化)

相关问题