此问题的一个解决方案是使用Handler.postDelayed()方法。一些谷歌培训材料提出同样的解决方案。@Overridepublic 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); }
然而,一些人指出,上述解决方案导致内存泄漏因为它使用一个非静态的内部类和匿名类,它隐式地保存对其外部类的引用,所以活动。当活动上下文被垃圾收集时,这是一个问题。
一个更复杂的解决方案,它可以避免内存泄漏子类Handler和Runnable对于活动中的静态内部类,因为静态内部类不包含对其外部类的隐式引用:private static class MyHandler extends Handler {}private final MyHandler mHandler = new MyHandler();public static class MyRunnable implements Runnable {
private final WeakReference 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的静态类中是必需的。