gpt4 book ai didi

android - 如何在 Android 中暂停/休眠线程或进程?

转载 作者:IT老高 更新时间:2023-10-28 12:50:34 27 4
gpt4 key购买 nike

我想在两行代码之间做个停顿,让我解释一下:

-> 用户单击一个按钮(实际上是一张卡片),我通过更改此按钮的背景来显示它:

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()方法。一些谷歌training materials建议相同的解决方案。

@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);
}

但是,有人指出上面的解决方案causes a memory leak因为它使用了一个非静态的内部匿名类,隐含地持有对其外部类 Activity 的引用。当 Activity 上下文被垃圾收集时,这是一个问题。

避免内存泄漏的更复杂的解决方案是在 Activity 内部使用静态内部类将 HandlerRunnable 子类化,因为静态内部类不包含对其的隐式引用外部类:

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到 Activity,这在需要访问 UI 的静态类中是必需的。

关于android - 如何在 Android 中暂停/休眠线程或进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1520887/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com