您也可以使用android.os.Handler 类的postDelayed 方法代替
java.util.Timer 类的scheduleAtFixedRate 方法。
只需创建android.os.Handler 类的实例并调用android.os.Handler 实例的postDelayed 方法,而不是创建java.util.Timer 类的实例并调用java.util.Timer 实例的scheduleAtFixedRate 方法。
请注意,您必须将TimerTask 接口替换为Runnable 接口。
在Runnable 实例的run 方法结束时(作为第一个参数传递给android.os.Handler 实例的postDelayed 方法)以新的随机延迟再次调用相同的postDelayed 方法android.os.Handler 实例与相同 Runnable 实例!
无需创建TimerTask 的新实例,也无需创建Runnable 的新实例!
这更有效,因为在堆内存上分配的对象更少,因此垃圾收集器在以这种方式从堆内存中释放对象时不那么忙!
有一个我自己用自己的想法写的demo:
import android.os.Handler;
import java.util.Random;
public class Demo
{
private boolean postAgain;
public void start()
{
postAgain = true;
final Handler handler = new Handler();
final Random random = new Random();
final Runnable runnable = () ->
{
log.d("Hello");
if (postAgain)
{
handler.postDelayed(runnable,random.nextInt(10000));
}
};
handler.postDelayed(runnable,random.nextInt(10000));
}
public void stop() { postAgain = false; }
请注意,上面的代码使用了 Java 8 lambda 表达式。
在 Java 7 及更低版本中,您可以创建实现 run 方法的 Runnable 接口的实例,而无需定义实现的新命名类
Runnable 接口。
另请注意,start 方法的所有局部变量必须全部为 final,以便能够在 lambda 表达式或 Runnable 实例的 run 方法中使用它们。
调用start 方法以随机延迟重复打印“Hello”并调用stop 方法来停止此操作。
请注意,stop 方法仅将 boolean 字段从 true 设置为 false 以停止循环。