溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android線程與消息處理

發(fā)布時(shí)間:2020-07-11 05:25:25 來源:網(wǎng)絡(luò) 閱讀:383 作者:Android_JIE 欄目:移動(dòng)開發(fā)

一、實(shí)現(xiàn)多線程

1.創(chuàng)建線程
(1)通過Thread創(chuàng)建線程

Thread thread = new Thread(new Runnable(){
    @Override
    public void run() {
        // TODO Auto-generated method stub
    }
});

(2)通過實(shí)現(xiàn)Runnable()接口創(chuàng)建線程

public class MainActivity extends Activity implements Runnable{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

    @Override
    public void run() {
        // TODO Auto-generated method stub

    }
}

2.線程的開啟

thread.start();

3.線程的休眠

Thread.sleep(1000);//休眠1秒

4.中斷線程

public class MainActivity extends Activity implements Runnable{

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

        LooperThread thread = new LooperThread();
        thread.start();
        thread.interrupt();
    }

        @Override
    public void run() {
        // TODO Auto-generated method stub
        while(!Thread.currentThread().isInterrupted()){
            // do something
        }
    }
}

二、Handler消息傳遞機(jī)制

前面介紹了現(xiàn)成的用法,不過不能在新建的子線程中對(duì)UI進(jìn)行修改。如果要操作,會(huì)報(bào)錯(cuò)Only the original thread that created a view hierarchy can touch its views。為此,Android引入Handler消息傳遞機(jī)制,來實(shí)現(xiàn)在線程中操作UI界面。

1.循環(huán)者(Looper)簡(jiǎn)介
在Android中,一個(gè)線程對(duì)應(yīng)一個(gè)Looper對(duì)象,一個(gè)Looper對(duì)象對(duì)應(yīng)一個(gè)MessageQueue(消息隊(duì)列)。MessageQueue用于存放message。在MessageQueue中,存放的消息按照FIFO原則執(zhí)行。

Looper對(duì)象用來為線程開啟一個(gè)消息循環(huán),從而操作MessageQueue。默認(rèn)情況下,系統(tǒng)自動(dòng)為主線程創(chuàng)建Looper對(duì)象,開啟消息循環(huán)。所以,在主線程中用下面的代碼創(chuàng)建Handler對(duì)象不會(huì)出錯(cuò),而在非主線程中則會(huì)報(bào)錯(cuò)。

Handler handler = new Handler();

如果想在非主線程中創(chuàng)建Handler對(duì)象,必須用到Looper:

public class LooperThread extends Thread {
    public Handler h;

    @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();

        Looper.prepare();           //

        h = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                // TODO Auto-generated method stub
                Log.i("Looper", String.valueOf(msg.what));
            }
        };
        Message m = h.obtainMessage();
        m.what = 0x11;
        h.sendMessage(m);

        Looper.loop();
    }
}

2.消息處理類(Handler)簡(jiǎn)介

Handler主要有以下兩個(gè)作用:
(1)將Message或Runnable應(yīng)用post()或sendMessage()方法發(fā)送到MessageQueue中,發(fā)送時(shí)可以指定延遲時(shí)間或者綁定的Bundle數(shù)據(jù)。當(dāng)MessageQueue循環(huán)到該Message時(shí),調(diào)用handlerMessage()方法對(duì)其處理。

(2)在子線程與主線程進(jìn)行通信,也就是在工作線程中與UI進(jìn)行通信

3.消息類(Message)簡(jiǎn)介
Message具有如下5個(gè)屬性

1.arg1 int 用來存放整型數(shù)據(jù)
2.arg2 int 用來存放整型數(shù)據(jù)
3.obj Object用來存放發(fā)送給接收器的Object類型的任意對(duì)象
4.replyTo Messenger用來指定該Message該發(fā)往何處
5.what int 用戶自定義消息代碼
在使用時(shí),需要注意以下3點(diǎn):

1.通常使用Message.obtain()或Handler.obtainMessage()獲取空消息對(duì)象,以節(jié)省資源
2.如果一個(gè)Message只需要攜帶簡(jiǎn)單的int信息,優(yōu)先使用arg1和arg2來傳遞,這比Bundle節(jié)省內(nèi)存
3.盡可能用Message.what來標(biāo)識(shí)信息

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI