重溫HandlerThread

這個大家一點兒都不陌生果覆,今天在復習的時候簡單寫了一個demo呜笑,簡單記錄下夫否,方便以后復習。
這里主要是模擬下載實現(xiàn)叫胁,用兩種方式實現(xiàn)凰慈,對比學習HandlerThread。下面上代碼:
///////HandlerThreadActivity.java

/**
 * create by xiaoya on 2019-12-04
 * des:模擬下載使用HandlerThread的demo曹抬;
 **/
public class HandlerThreadActivity extends Activity implements View.OnClickListener, Handler.Callback {

    /**
     * 我是按鈕
     */
    private TextView mTvBtn;
    private Handler handler;
    private DownLoadThread handlerThread;
    private MyHandlerThread myHandlerThread;
    /**
     * 開始下載
     */
    private TextView mTvStart;
    /**
     * 完成下載
     */
    private TextView mTvFinish;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_handlerthread);
        initView();
        //使用系統(tǒng)的HandlerThread
//        initHandlerThread();
        //使用自己實現(xiàn)的Handler+Thread溉瓶;
        initMyHandlerThread();


    }
    private void initHandlerThread(){
        handler = new Handler(this);
        handlerThread = new DownLoadThread("logReapt");
        handlerThread.setUiHandler(handler);
        handlerThread.setUrlLists("qqqqqq", "qqwwwwww", "errtttttt", "jjjjjjjjjjjj");
    }

    private void initMyHandlerThread(){
        handler = new Handler(this);
        myHandlerThread = new MyHandlerThread("logReapt");
        myHandlerThread.setUiHandler(handler);
        myHandlerThread.setUrlLists("qqqqqq", "qqwwwwww", "errtttttt", "jjjjjjjjjjjj");
    }

    private void initView() {
        mTvBtn = (TextView) findViewById(R.id.tv_btn);
        mTvBtn.setOnClickListener(this);
        mTvStart = (TextView) findViewById(R.id.tv_start);
        mTvFinish = (TextView) findViewById(R.id.tv_finish);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            default:
                break;
            case R.id.tv_btn:
//                handlerThread.start();
                myHandlerThread.start();
                mTvBtn.setEnabled(false);
                break;
        }
    }

    @Override
    public boolean handleMessage(Message msg) {

        switch (msg.what) {
            case DownLoadThread.TYPE_START:
                mTvStart.setText(mTvStart.getText().toString()+"   "+msg.obj);
                mTvBtn.setVisibility(View.VISIBLE);
                break;
            case DownLoadThread.TYPE_FINISHED:
                mTvFinish.setText(mTvFinish.getText().toString()+"   "+msg.obj);
                mTvBtn.setVisibility(View.GONE);
                break;
            default:
                break;
        }
        return true;
    }
}

///////DownLoadThread.java

public class DownLoadThread extends HandlerThread implements Handler.Callback {


    private final String KEY_URL = "url";
    public static final int TYPE_START = 1;
    public static final int TYPE_FINISHED = 2;
    private Handler uiHandler;
    private Handler workerHandler;


    private List<String> urlLists;

    public DownLoadThread(String name) {
        super(name);
    }

    public DownLoadThread(String name, int priority) {
        super(name, priority);
    }


    @Override
    protected void onLooperPrepared() {
        super.onLooperPrepared();
        workerHandler = new Handler(getLooper(), this);

        if (uiHandler == null) {
            throw new IllegalArgumentException("not set uiHandler");
        }

        for (String url : urlLists) {
            Message message = workerHandler.obtainMessage();
            Bundle bundle = new Bundle();
            bundle.putString(KEY_URL, url);
            message.setData(bundle);
            workerHandler.sendMessage(message);
        }

    }

    public void setUrlLists(String... urls) {
        urlLists = Arrays.asList(urls);
    }

    public Handler getUIHandler() {
        return uiHandler;
    }


    public DownLoadThread setUiHandler(final Handler handler) {
        uiHandler = handler;
        return this;
    }

    @Override
    public boolean handleMessage(Message msg) {

        if (msg == null || msg.getData() == null) {
            return false;
        }
        String path = (String) msg.getData().get(KEY_URL);


        Message startMsg = uiHandler.obtainMessage(TYPE_START, "開始下載 @" + System.currentTimeMillis() + "  url==" + path);
        uiHandler.sendMessage(startMsg);

        SystemClock.sleep(3000);


        Message finishMsg = uiHandler.obtainMessage(TYPE_FINISHED, "完成下載 @" + System.currentTimeMillis() + "  url==" + path);
        uiHandler.sendMessage(finishMsg);

        return true;
    }

    @Override
    public boolean quitSafely() {
        uiHandler = null;
        return super.quitSafely();
    }
}

///////MyHandlerThread.java

public class MyHandlerThread extends Thread implements Handler.Callback {

    private Handler handler;
    private final String KEY_URL = "url";
    public static final int TYPE_START = 1;
    public static final int TYPE_FINISHED = 2;

    private Handler workerHandler;

    private List<String> urlLists;


    public MyHandlerThread(String name) {
        super(name);
    }

    @Override
    public void run() {
        super.run();
        Looper.prepare();//@1111
        workerHandler = new Handler(this);
        for (String url : urlLists) {
            Message message = workerHandler.obtainMessage();
            Bundle bundle = new Bundle();
            bundle.putString(KEY_URL, url);
            message.setData(bundle);
            workerHandler.sendMessage(message);
        }
        Looper.loop();//@2222
    }


    public void setUrlLists(String... urls) {
        urlLists = Arrays.asList(urls);
    }

    public Handler getUIHandler() {
        return handler;
    }


    public MyHandlerThread setUiHandler(final Handler handler) {
        this.handler = handler;
        return this;
    }

    @Override
    public boolean handleMessage(Message msg) {
        //處理相關消息;
        if (msg == null || msg.getData() == null) {
            return  false;
        }
        String path = (String) msg.getData().get(KEY_URL);


        Message startMsg = handler.obtainMessage(TYPE_START, "開始下載 @" + System.currentTimeMillis() + "  url==" + path);
        handler.sendMessage(startMsg);

        SystemClock.sleep(3000);


        Message finishMsg = handler.obtainMessage(TYPE_FINISHED, "完成下載 @" + System.currentTimeMillis() + "  url==" + path);
        handler.sendMessage(finishMsg);
        return true;
    }
}

很明顯谤民,再比對HandlerThread的源碼可以發(fā)現(xiàn)堰酿,刨去安全性能問題,最大的區(qū)別就是我們自己使用Handler+Thread實現(xiàn)的時候需要注釋中@1111和@2222兩處的Looper.prepare()和Looper.loop()张足。O(∩_∩)O哈哈~

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末触创,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子为牍,更是在濱河造成了極大的恐慌哼绑,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碉咆,死亡現(xiàn)場離奇詭異抖韩,居然都是意外死亡,警方通過查閱死者的電腦和手機疫铜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門茂浮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人壳咕,你說我怎么就攤上這事席揽。” “怎么了谓厘?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵幌羞,是天一觀的道長。 經(jīng)常有香客問我竟稳,道長属桦,這世上最難降的妖魔是什么熊痴? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮聂宾,結果婚禮上愁拭,老公的妹妹穿的比我還像新娘。我一直安慰自己亏吝,他們只是感情好岭埠,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蔚鸥,像睡著了一般惜论。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上止喷,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天馆类,我揣著相機與錄音,去河邊找鬼弹谁。 笑死乾巧,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的预愤。 我是一名探鬼主播沟于,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼植康!你這毒婦竟也來了旷太?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤销睁,失蹤者是張志新(化名)和其女友劉穎供璧,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冻记,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡睡毒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了冗栗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片演顾。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖贞瞒,靈堂內(nèi)的尸體忽然破棺而出偶房,到底是詐尸還是另有隱情趁曼,我是刑警寧澤军浆,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站挡闰,受9級特大地震影響乒融,放射性物質發(fā)生泄漏掰盘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一赞季、第九天 我趴在偏房一處隱蔽的房頂上張望愧捕。 院中可真熱鬧,春花似錦申钩、人聲如沸次绘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽邮偎。三九已至,卻和暖如春义黎,著一層夾襖步出監(jiān)牢的瞬間禾进,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工廉涕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留泻云,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓狐蜕,卻偏偏與公主長得像宠纯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子层释,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354