我想在两行代码之间暂停一下,让我解释一下:
->用户点击一个按钮(事实上是一张卡片),我通过改变这个按钮的背景来显示它:
thisbutton.setBackgroundResource(R.drawable.icon);
->让我们说1秒后,我需要通过改变它的背景回到按钮的前一个状态:
thisbutton.setBackgroundResource(R.drawable.defaultcard);
我试着在这两行代码之间暂停线程:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
然而,这是行不通的。也许这是进程,而不是线程,我需要暂停?
我也试过(但没用):
new Reminder(5);
用这个:
public class Reminder {
Timer timer;
public Reminder(int seconds) {
timer = new Timer();
timer.schedule(new RemindTask(), seconds*1000);
}
class RemindTask extends TimerTask {
public void run() {
System.out.format("Time's up!%n");
timer.cancel(); //Terminate the timer thread
}
}
}
如何暂停/休眠线程或进程?
这个问题的一个解决方案是使用Handler.postDelayed()方法。一些谷歌培训材料提出了同样的解决方案。
@Override
public void onClick(View v) {
my_button.setBackgroundResource(R.drawable.icon);
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
my_button.setBackgroundResource(R.drawable.defaultcard);
}
}, 2000);
}
然而,有些人指出,上面的解决方案会导致内存泄漏,因为它使用了一个非静态的内部匿名类,该类隐式地保存了对其外部类(activity)的引用。当活动上下文被垃圾收集时,这是一个问题。
一个更复杂的解决方案,避免内存泄漏子类Handler和Runnable与静态内部类在活动中,因为静态内部类不持有对它们的外部类的隐式引用:
private static class MyHandler extends Handler {}
private final MyHandler mHandler = new MyHandler();
public static class MyRunnable implements Runnable {
private final WeakReference<Activity> mActivity;
public MyRunnable(Activity activity) {
mActivity = new WeakReference<>(activity);
}
@Override
public void run() {
Activity activity = mActivity.get();
if (activity != null) {
Button btn = (Button) activity.findViewById(R.id.button);
btn.setBackgroundResource(R.drawable.defaultcard);
}
}
}
private MyRunnable mRunnable = new MyRunnable(this);
public void onClick(View view) {
my_button.setBackgroundResource(R.drawable.icon);
// Execute the Runnable in 2 seconds
mHandler.postDelayed(mRunnable, 2000);
}
注意,Runnable使用活动的WeakReference,这在需要访问UI的静态类中是必要的。