这个问题的一个很好的解决方案是使用
Handler.postDelayed()方法。然而,下面的解决方案,
causes a memory leak,因为它使用非静态内部和匿名类,隐式保存对其外部类的引用,活动。这是一个问题,当活动上下文应该是垃圾收集:
@Override
public void onClick(View v) {
my_button.setBackgroundResource(R.drawable.icon);
// This solution will leak memory! Don't use!!!
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的静态类中是必需的。