我想在两行代码之间暂停一下,让我解释一下:
-> 用户单击一个按钮(实际上是一张卡片),我通过更改该按钮的背景来显示它:
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() http://developer.android.com/reference/android/os/Handler.html方法。一些谷歌培训教材 https://cswithandroid.withgoogle.com/lesson-plans/facilitator-guide.html建议相同的解决方案。
@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);
}
然而,有些人指出上述解决方案导致内存泄漏 http://www.androiddesignpatterns.com/2013/01/inner-class-handler-memory-leak.html因为它使用非静态内部匿名类,该类隐式保存对其外部类(即活动)的引用。当活动上下文被垃圾收集时,这是一个问题。
避免内存泄漏的更复杂的解决方案是子类化Handler
and 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
uses a 弱引用 https://developer.android.com/reference/java/lang/ref/WeakReference.html到 Activity,这在需要访问 UI 的静态类中是必需的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)