Android 延時操作筆記

  • 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();
                        }
                    }
                });
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纫溃,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子韧掩,更是在濱河造成了極大的恐慌紊浩,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疗锐,死亡現(xiàn)場離奇詭異坊谁,居然都是意外死亡,警方通過查閱死者的電腦和手機窒悔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門呜袁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人简珠,你說我怎么就攤上這事阶界『缗ィ” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵膘融,是天一觀的道長诈悍。 經(jīng)常有香客問我除呵,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任攒暇,我火速辦了婚禮指巡,結(jié)果婚禮上蚤认,老公的妹妹穿的比我還像新娘队魏。我一直安慰自己,他們只是感情好臼疫,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布择份。 她就那樣靜靜地躺著,像睡著了一般烫堤。 火紅的嫁衣襯著肌膚如雪荣赶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天鸽斟,我揣著相機與錄音拔创,去河邊找鬼。 笑死富蓄,一個胖子當著我的面吹牛剩燥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播格粪,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼躏吊,長吁一口氣:“原來是場噩夢啊……” “哼氛改!你這毒婦竟也來了帐萎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤胜卤,失蹤者是張志新(化名)和其女友劉穎疆导,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體葛躏,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡澈段,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了舰攒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片败富。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖摩窃,靈堂內(nèi)的尸體忽然破棺而出兽叮,到底是詐尸還是另有隱情芬骄,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布鹦聪,位于F島的核電站账阻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏泽本。R本人自食惡果不足惜淘太,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望规丽。 院中可真熱鬧蒲牧,春花似錦、人聲如沸赌莺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽雄嚣。三九已至晒屎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缓升,已是汗流浹背鼓鲁。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留港谊,地道東北人骇吭。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像歧寺,于是被迫代替她去往敵國和親燥狰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,189評論 25 707
  • 異步消息處理線程啟動后會進入一個無限的循環(huán)體之中斜筐,每循環(huán)一次龙致,從其內(nèi)部的消息隊列中取出一個消息,然后回調(diào)相應(yīng)的消息...
    cxm11閱讀 6,425評論 2 39
  • Android Handler機制系列文章整體內(nèi)容如下: Android Handler機制1之ThreadAnd...
    隔壁老李頭閱讀 8,189評論 8 57
  • 今天leo主要總結(jié)線程方面的顷链,分為以下幾個知識點: ? 認識線程 ? 線程的基本用法 ? 線程同步 ? 子線程...
    SingleoD閱讀 9,373評論 25 77
  • 星城二十多天的雨目代,總是不消停,讓春光不明媚嗤练,潮濕的日子榛了,總讓人心生煩擾。那細細碎碎的心情煞抬,就像是老墻上的厚綠青...
    那些年聆聽的閱讀 199評論 0 0