微信輸入狀態(tài)

在微信中啸蜜,當(dāng)和別人進(jìn)行聊天時江兢,如果對方正在輸入文字,我們可以看到對方的輸入狀態(tài)雳刺。


微信正在輸入狀態(tài)

如果這時對方將輸入的文字清空或發(fā)送后劫灶,則正在輸入狀態(tài)消失。這個過程是這樣的:

  • A向B發(fā)送文字消息掖桦,當(dāng)A輸入文字的EditText有內(nèi)容本昏,A向B發(fā)送一個消息包X,這個消息包X代表著“正在輸入狀態(tài)”枪汪。
    再對A的輸入狀態(tài)定時進(jìn)行檢測涌穆,假設(shè)5s檢測一下,如果5s后發(fā)現(xiàn)EditText還是不為空雀久,再發(fā)送消息包X宿稀,如果EditText內(nèi)容為空,發(fā)送另外一個消息包Y赖捌,這個消息包Y代表著“消息發(fā)送取消”祝沸。
    如果點擊發(fā)送按鈕,則發(fā)送文本消息包Z。
  • B接收A的消息罩锐,當(dāng)B收到消息包X后奉狈,在界面顯示“對方正在輸入”,為防止因為網(wǎng)絡(luò)原因沒有接收到Y(jié)或者Z消息包而一直顯示輸入狀態(tài)涩惑,B會馬上啟動一個定時任務(wù)仁期,代號“TASK”,清空顯示著的發(fā)送狀態(tài)竭恬,這個定時時間會大于A的發(fā)送周期跛蛋,假設(shè)6s。即B接到消息包X后馬上發(fā)送一個6s后清空顯示著的發(fā)送狀態(tài)的TASK痊硕。
    如果B在6s內(nèi)接到消息包X赊级,則取消上面的TASK并啟動新的TASK。
    如果B在6s內(nèi)沒接到消息包X寿桨,則TASK將輸入狀態(tài)清空此衅。微信中這是顯示的應(yīng)該是A的昵稱强戴。
    如果B接收到消息包Y亭螟,則將輸入狀態(tài)清空。
    如果B接收到消息包Z骑歹,則將輸入狀態(tài)清空预烙,顯示A發(fā)送的文本消息。

讓TASK在一段時間后執(zhí)行道媚,并且可以在執(zhí)行前取消扁掸。這個時候就可以使用Timer或者ScheduledExecutorService。先講講Timer最域。

Timer##

Timer定時器實際上是個線程谴分,定時調(diào)度所擁有的TimerTask。需要定時執(zhí)行的代碼放到run方法體內(nèi)镀脂。
先看個簡單的例子:

public class ScheduleTask {
    static TimerTask task = new TimerTask() {
        @Override
        public void run() {
            System.out.println("Execut Task Time:" + System.currentTimeMillis());
        }
    };
    
    public static void main(String[] args) {
        long beginTime = System.currentTimeMillis();
        System.out.println("Application Begin Time:" + beginTime);
        Timer timer1 = new Timer();
        timer1.schedule(task, 1000);
    }
}

執(zhí)行結(jié)果可以看到任務(wù)在延遲1s后執(zhí)行了:

Application Begin Time:1420366178189
Execut Task Time:1420366179190

在Timer類中schedule()方法如下:

  1. Timer.schedule(TimerTask task,Date time)在制定的時間執(zhí)行指定的任務(wù)
  • Timer.schedule(TimerTask task,Date firstTime ,long period)在指定的時間開始進(jìn)行牺蹄,之后重復(fù)的延遲執(zhí)行
  • Timer.schedule(TimerTask task,long delay)在延遲后執(zhí)行任務(wù)
  • Timer.schedule(TimerTask task,long delay,long period)從延遲后開始進(jìn)行,之后重復(fù)的延遲執(zhí)行
  • Timer.scheduleAtFixedRate(TimerTask task,Date firstTime,long period)任務(wù)在指定的時間開始進(jìn)行重復(fù)固定速率執(zhí)行
  • Timer.scheduleAtFixedRate(TimerTask task,long delay,long period)任務(wù)在指定的延遲后開始進(jìn)行重復(fù)固定速率執(zhí)行

其中schedule與scheduleAtFixedRate的使用還是有區(qū)別的:
schedule:適用于那些需要“平穩(wěn)”運行的重復(fù)執(zhí)行活動薄翅。換句話說沙兰,它適用于在短期運行中保持頻率準(zhǔn)確要比在長期運行中更為重要的活動。這包括大多數(shù)動畫任務(wù)翘魄,如以固定時間間隔閃爍的光標(biāo)鼎天。這還包括為響應(yīng)人類活動所執(zhí)行的固定活動,如在按住鍵時自動重復(fù)輸入字符暑竟。
scheduleAtFixedRate:適用于那些對絕對時間敏感的重復(fù)執(zhí)行活動斋射,如每小時準(zhǔn)點打鐘報時,或者在每天的特定時間運行已安排的維護活動。它還適用于那些完成固定次數(shù)執(zhí)行的總計時間很重要的重復(fù)活動罗岖,如倒計時的計時器怀大,每秒鐘滴答一次,共10 秒鐘呀闻。最后化借,固定速率執(zhí)行適用于安排多個重復(fù)執(zhí)行的計時器任務(wù),這些任務(wù)相互之間必須保持同步捡多。
在Timer類中還有一個比較常用的方法就是cancel()蓖康,用于終止定時任務(wù)。

ScheduledExecutorService##

ScheduledExecutorService有四個方法:

ScheduledExecutorService的方法

方法與上面的相似垒手,這次就不做解釋了蒜焊,注意看這四個方法返回的類型都為ScheduledFuture<?>,而interface ScheduledFuture<V> extends Delayed, Future<V>所以取消任務(wù)方法在Future中科贬。
Future的方法

直接看例子泳梆,以最開始說的用戶B收到消息X為例,在項目中的用法為:

if (receivedStatus == Presence.STATUS_TEXT){
    // 1. 第一次接到STATUS_TEXT榜掌,將abTabTitleText設(shè)置成“對方正在輸入...”
    // 2. 4.5s后調(diào)度執(zhí)行showConnectionState (之所以是4.5秒 是因為發(fā)送那邊的間隔是4秒)
    // 3. 再次接到STATUS_TEXT优妙,將上一個調(diào)度取消
    // 4. 執(zhí)行2調(diào)度
    abTabTitleText.setText("對方正在輸入...");
    if (textRecevieTaskCount > 0){
        cancelTextRecevieFuture();
    }

    scheduleTextRecevie();
    textRecevieTaskCount ++;

收到消息后馬上執(zhí)行scheduleTextRecevie()方法:

 private void scheduleTextRecevie(){
        textRecevieTaskFuture = executor.schedule(new Runnable() {
            @Override
            public void run() {
                mainHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        if (textRecevieTaskFuture != null){
                            showConnectionState();
                            textRecevieTaskCount = 0;
                            textRecevieTaskFuture = null;
                        }
                    }
                });
            }
        }, 4500L, TimeUnit.MILLISECONDS);
   }    

取消任務(wù)方法為:

 private void cancelTextRecevieFuture(){
        if (textRecevieTaskFuture != null){
            textRecevieTaskFuture.cancel(true);
            textRecevieTaskFuture = null;
        }
  }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市憎账,隨后出現(xiàn)的幾起案子套硼,更是在濱河造成了極大的恐慌,老刑警劉巖胞皱,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邪意,死亡現(xiàn)場離奇詭異,居然都是意外死亡反砌,警方通過查閱死者的電腦和手機雾鬼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宴树,“玉大人策菜,你說我怎么就攤上這事∩ィ” “怎么了做入?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長同衣。 經(jīng)常有香客問我竟块,道長,這世上最難降的妖魔是什么耐齐? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任浪秘,我火速辦了婚禮蒋情,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘耸携。我一直安慰自己棵癣,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布夺衍。 她就那樣靜靜地躺著狈谊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沟沙。 梳的紋絲不亂的頭發(fā)上河劝,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機與錄音矛紫,去河邊找鬼赎瞎。 笑死,一個胖子當(dāng)著我的面吹牛颊咬,可吹牛的內(nèi)容都是我干的务甥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼喳篇,長吁一口氣:“原來是場噩夢啊……” “哼敞临!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起杭隙,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤哟绊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后痰憎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡攀涵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年铣耘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片以故。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蜗细,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出怒详,到底是詐尸還是另有隱情炉媒,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布昆烁,位于F島的核電站吊骤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏静尼。R本人自食惡果不足惜白粉,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一传泊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鸭巴,春花似錦眷细、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至恬口,卻和暖如春池磁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背楷兽。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工地熄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人芯杀。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓端考,卻偏偏與公主長得像,于是被迫代替她去往敵國和親揭厚。 傳聞我的和親對象是個殘疾皇子却特,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)筛圆,斷路器裂明,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • Timer 定時器相信都不會陌生,之所以拿它來做源碼分析太援,是發(fā)現(xiàn)整個控制流程可以體現(xiàn)很多有意思的東西闽晦。 在業(yè)務(wù)開發(fā)...
    石先閱讀 6,344評論 2 13
  • 1.什么是Activity?問的不太多仙蛉,說點有深度的 四大組件之一,一般的,一個用戶交互界面對應(yīng)一個activit...
    JoonyLee閱讀 5,732評論 2 51
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,129評論 25 707
  • 現(xiàn)如今,玩小葉紫檀手串的朋友們越來越多碱蒙,剛開始大家都會試水玩玩入門級的小葉紫檀荠瘪,隨著品味慢慢變高,便想要追求品質(zhì)更...
    林遠(yuǎn)騰博客閱讀 338評論 0 0