简单介绍一下本文出现的名词:
Handler:可接受子线程发送的消息数据, 主要用来主线程更新UI。
用Java线程来实现
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//todo
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_demo);
new Thread(new HandleThread()).start();
}
public class HandleThread implements Runnable {
@Override
public void run() {
while (true) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Message message = new Message();
message.what = 1;
mHandler.sendMessage(message);
}
}
}
用Android原生API实现
private Timer mTimer = new Timer();
private TimerTask mTimerTask;
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//todo
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_demo);
mTimerTask = new TimerTask() {
@Override
public void run() {
Message message = new Message();
message.what = 1;
mHandler.sendMessage(message);
}
};
mTimer.schedule(mTimerTask, 2000, 2000);
}
/**
* 停止计时器
*/ public void cancelTimer() {
mTimer.cancel();
}
在我的项目中,上面两种方式好少用到了,现在比较常用的是RxJava2的定时器
private Disposable mDisposable;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_demo);
mDisposable = Observable.timer(5000, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) {
//todo 5秒后执行
}
}, throwable -> {
});
}
/**
* 停止计时
*/ public void cancel() {
if (mDisposable.isDisposed()) {
mDisposable.dispose();
}
}
private Disposable mDisposable;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_demo);
mDisposable = Observable.interval(5000, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) {
//todo 每隔5s执行一次
}
}, throwable -> {
});
}
/**
* 停止计时
*/ public void cancel() {
if (mDisposable.isDisposed()) {
mDisposable.dispose();
}
}
RxJava定时任务提供了很多方便的API就不一一写了