Handler的簡(jiǎn)單使用

一個(gè)handler對(duì)象中有對(duì)應(yīng)的線(xiàn)程隊(duì)列和消息隊(duì)列,如下示例線(xiàn)程隊(duì)列:
布局文件(很簡(jiǎn)單既绕,就兩個(gè)按鈕啄刹,一個(gè)TextView):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.austin.handlerstudy.MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btn_start"
        android:text="開(kāi)始" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btn_stop"
        android:text="停止" />


    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <TextView
                android:id="@+id/tv_info"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                tools:text="第一條信息" />
        </LinearLayout>
    </ScrollView>
</LinearLayout>
public class MainActivity extends AppCompatActivity {

    TextView tvInfo;
    Button btnStart,btnStop;
    Handler handler = new Handler();
    MyTask task = new MyTask();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        tvInfo = findViewById(R.id.tv_info);
        btnStart = findViewById(R.id.btn_start);
        btnStop = findViewById(R.id.btn_stop);

        btnStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                handler.post(task);
            }
        });
        btnStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                handler.removeCallbacks(task);
            }
        });

    }

    class MyTask extends Thread{
        @Override
        public void run() {
            tvInfo.append("\n received msg!");
            handler.postDelayed(task,3000);
        }
    }
}

運(yùn)行時(shí)點(diǎn)擊start,就會(huì)每隔三秒打印一次msg凄贩,點(diǎn)擊stop后停止接收和打印誓军。這就是一個(gè)簡(jiǎn)單的線(xiàn)程隊(duì)列應(yīng)用的例子,但注意疲扎,此時(shí)調(diào)用的run方法昵时,其實(shí)沒(méi)有真正啟動(dòng)給一個(gè)子線(xiàn)程廓译,相當(dāng)于手動(dòng)調(diào)用了一次run方法而已,也就是說(shuō)所有消息的創(chuàng)建和處理都在主線(xiàn)程债查。


GIF.gif

下面演示如何在主線(xiàn)程發(fā)消息由子線(xiàn)程處理:


public class Handler2Act extends AppCompatActivity {
    private final String TAG = Handler2Act.class.getSimpleName();

    MyHandler mHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.content_handler2);

        Log.e(TAG,"MainActivity所在線(xiàn)程名:"+Thread.currentThread().getName()+" 線(xiàn)程Id"+Thread.currentThread().getId());
        //HandlerThread實(shí)現(xiàn)了使用Looper來(lái)處理消息隊(duì)列的功能
        HandlerThread handlerThread = new HandlerThread("my handler thread");
        handlerThread.start();
        //getLooper()一定要寫(xiě)在線(xiàn)程start方法之后
        mHandler = new MyHandler(handlerThread.getLooper());
        Message msg = mHandler.obtainMessage();
        msg.arg1 = 5;
        msg.sendToTarget();//發(fā)送消息到創(chuàng)建該消息的handler的looper所在線(xiàn)程上
    }

    class MyHandler extends Handler{
        MyHandler(Looper looper){
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            Log.e(TAG,"MyHandler所在線(xiàn)程名字:"+Thread.currentThread().getName()+" 線(xiàn)程id:"+Thread.currentThread().getId());
        }
    }
}

temp.jpg

可以發(fā)現(xiàn)handlerMessage方法運(yùn)行在了子線(xiàn)程非区。

HandlerThread優(yōu)點(diǎn):

  • HandlerThread 內(nèi)部實(shí)現(xiàn)了一個(gè)Handler輪循器,可以使用它而非主線(xiàn)程中自帶的輪循器從而避免主線(xiàn)程任務(wù)過(guò)多和壓力過(guò)大導(dǎo)致的流暢度不佳盹廷。
  • 可以處理多個(gè)任務(wù)征绸,開(kāi)啟一個(gè)線(xiàn)程起到多個(gè)線(xiàn)程的作用。因?yàn)槠鋬?nèi)部Handler.handleMessage的執(zhí)行俄占,一定在它的Looper的線(xiàn)程中管怠。(Looper共享)
    舉例:HandlerThread與Camera能夠Looper共享。
    所以Handler機(jī)制(消息機(jī)制)不僅僅是能夠?qū)崿F(xiàn)主子線(xiàn)程通訊缸榄,還能實(shí)現(xiàn)資源共享(Looper共享)渤弛。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市甚带,隨后出現(xiàn)的幾起案子她肯,更是在濱河造成了極大的恐慌,老刑警劉巖鹰贵,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晴氨,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡碉输,警方通過(guò)查閱死者的電腦和手機(jī)籽前,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)敷钾,“玉大人枝哄,你說(shuō)我怎么就攤上這事∽杌模” “怎么了挠锥?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)财松。 經(jīng)常有香客問(wèn)我瘪贱,道長(zhǎng),這世上最難降的妖魔是什么辆毡? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮甜害,結(jié)果婚禮上舶掖,老公的妹妹穿的比我還像新娘。我一直安慰自己尔店,他們只是感情好眨攘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布主慰。 她就那樣靜靜地躺著,像睡著了一般鲫售。 火紅的嫁衣襯著肌膚如雪共螺。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,155評(píng)論 1 299
  • 那天情竹,我揣著相機(jī)與錄音藐不,去河邊找鬼。 笑死秦效,一個(gè)胖子當(dāng)著我的面吹牛雏蛮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播阱州,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼挑秉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了苔货?” 一聲冷哼從身側(cè)響起犀概,我...
    開(kāi)封第一講書(shū)人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎夜惭,沒(méi)想到半個(gè)月后阱冶,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡滥嘴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年木蹬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片若皱。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡镊叁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出走触,到底是詐尸還是另有隱情晦譬,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布互广,位于F島的核電站敛腌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏惫皱。R本人自食惡果不足惜像樊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望旅敷。 院中可真熱鬧生棍,春花似錦、人聲如沸媳谁。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至柔纵,卻和暖如春缔杉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背搁料。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工或详, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人加缘。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓鸭叙,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親拣宏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子沈贝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

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

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,372評(píng)論 8 265
  • public class MainActivity extends AppCompatActivity { p...
    RG的日常閱讀 259評(píng)論 0 0
  • 前言 在Android開(kāi)發(fā)的多線(xiàn)程應(yīng)用場(chǎng)景中,Handler機(jī)制十分常用 今天勋乾,我將手把手帶你深入分析Handle...
    BrotherChen閱讀 472評(píng)論 0 0
  • OC語(yǔ)言基礎(chǔ) 1.類(lèi)與對(duì)象 類(lèi)方法 OC的類(lèi)方法只有2種:靜態(tài)方法和實(shí)例方法兩種 在OC中宋下,只要方法聲明在@int...
    奇異果好補(bǔ)閱讀 4,271評(píng)論 0 11
  • 朋友之間的友誼各吨,時(shí)間一過(guò)枝笨,貌似過(guò)了時(shí)的舊物一般,毫不留情地被時(shí)光拋棄了嘛嗎揭蜒?朋友自打參加工作之后横浑,就感覺(jué)疏遠(yuǎn)了好多...
    清風(fēng)景行閱讀 564評(píng)論 6 3