- Thread
- Handler
- TimerTask
- RxJava
- 封裝
很基礎(chǔ)的東西,研究了一下不同的實現(xiàn)的方法,都大同小異媚值,記錄一下睦焕。
目標是延遲一段時間之后在主線程執(zhí)行操作藐握。
幾個方法都是靠 Handler 接受子線程發(fā)來的 msg 來實現(xiàn)線程的切換的效果,不同的是用什么方法來開啟一個新線程來達到延時發(fā)送 msg垃喊。
下面是接受到消息的 Handler:
要注意的是 Handler 在 new 的時候和當前環(huán)境中的線程綁定猾普,所以要保證在主線程中創(chuàng)建該對象。
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case 1:
// 在主線程中
break;
}
}
};
Thread
調(diào)用 Thread.sleep()
實現(xiàn)延時本谜。
new Thread(new Runnable() {
@Override
public void run() {
Thread.sleep(delayTime);
mHandler.sendMessage();
}
}).start();
Handler
postDelayed()
第二個參數(shù)傳入延時時間初家。
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mHandler .sendEmptyMessage(1);
}
},delayTime);
TimerTask
TimerTask 結(jié)合 Timer 實現(xiàn)延時操作。
TimerTask task = new TimerTask(){
public void run(){
mHandler .sendEmptyMessage(1);
}
};
Timer timer = new Timer();
timer.schedule(task, delayTime);
RxJava
這種方法雖然不用借助 Handler乌助,但是看起來太長了溜在,和其他的方法也沒有太多區(qū)別。
重點是delay(1, TimeUnit.SECONDS)
將事件流的發(fā)送延遲了 1 秒他托,
而 observeOn(AndroidSchedulers.mainThread())
將后續(xù)的線程切換到了主線程掖肋。
Observable.fromArray("a")
.subscribeOn(Schedulers.io())
.delay(1, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String value) {
// do something
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
//do something
}
});
封裝成一個類
用于僅僅需要延遲執(zhí)行一些簡單操作,封裝成一個工具類:
先看使用:
new TimeUtil(1, TimeUnit.SECONDS).setTodo(new TimeUtil.Todo() {
@Override
public void something() {
//在主線程中執(zhí)行
boolean isMain = Looper.myLooper() == Looper.getMainLooper();
Log.d(TAG, "isMain :" + isMain);
}
});
輸出為 true,確實在主線程中執(zhí)行赏参。
至于實現(xiàn)很簡單志笼,不贅述:
public class TimeUtil {
private Todo todo;
public TimeUtil(int delatTime,TimeUnit timeType){
//第一個參數(shù)是延遲的時間,第二個參數(shù)是時間的單位
delayTimeToDo(delatTime,timeType);
}
public void setTodo(Todo d){
todo = d;
}
public static interface Todo{
public void something();//調(diào)用時實現(xiàn)改方法
}
private void delayTimeToDo(int dalayTime,TimeUnit type){
//用 RxJava 比較省力把篓,用上述其他的方法是一樣的
Observable.fromArray("a")
.subscribeOn(Schedulers.io())
.delay(dalayTime,type)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String value) {
// do something
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
if (todo != null){
todo.something();
}
}
});
}
}