溫馨提示×

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

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

Android開(kāi)發(fā)中常見(jiàn)問(wèn)題有哪些

發(fā)布時(shí)間:2022-01-04 09:56:01 來(lái)源:億速云 閱讀:120 作者:小新 欄目:移動(dòng)開(kāi)發(fā)

這篇文章主要介紹Android開(kāi)發(fā)中常見(jiàn)問(wèn)題有哪些,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

(1) Service與Thread有什么區(qū)別?

(2) 在Activity里new Handler()和在自己創(chuàng)建的Thread中new Handler()有什么區(qū)別?

第一個(gè)問(wèn)題其實(shí)是一個(gè)偽命令,因?yàn)镾ervice是Android四大組件之一,而Thread只是Java提供的一個(gè)封裝了線程管理的工具類,無(wú)論是Activity還是Service,都可以通過(guò)Thread來(lái)創(chuàng)建一個(gè)工作線程,但是很多新手會(huì)搞不清楚它們之間的區(qū)別,借此可以試探一下面試者到底有沒(méi)有很清楚地理解Android的Service到底是做什么的。

第二個(gè)問(wèn)題,涉及到Android開(kāi)發(fā)必須掌握的知識(shí)點(diǎn):Handler,本文就來(lái)從這個(gè)問(wèn)題開(kāi)始,說(shuō)說(shuō)我對(duì)Handler的理解。

當(dāng)Android應(yīng)用啟動(dòng)后,系統(tǒng)會(huì)默認(rèn)創(chuàng)建一個(gè)主線程(Main thread)。這個(gè)主線程啟動(dòng)后,首先完成UI的繪制,然后會(huì)進(jìn)入一個(gè)消息循環(huán)(Loop),等待和執(zhí)行各種來(lái)自系統(tǒng)的消息和事件、各種用戶點(diǎn)擊/觸摸事件、其他線程發(fā)送的消息事件等等。這是線程工作的一種常見(jiàn)的模式,即進(jìn)入一種“等待命令”->“執(zhí)行命令/消息”->“等待命令/消息”的循環(huán)。

那么,其他非UI線程如何與進(jìn)入了消息循環(huán)的主線程交互呢?這就得靠Handler了。

Handler是Android系統(tǒng)為工作線程提供的一種可以與外界交互的接口,通過(guò)Handler提供的sendMessage()方法,外界可以發(fā)送各種消息事件給工作線程。Handler通過(guò)構(gòu)造函數(shù)完成與指定線程的綁定,其構(gòu)造函數(shù)定義如下:

public Handler() {
    this(null, false);
}

public Handler(Looper looper) {
    this(looper, null, false);
}

public Handler(Looper looper, Callback callback) {
    this(looper, callback, false);
}

public interface Callback {
    public boolean handleMessage(Message msg);
}

其中,Looper就是線程內(nèi)部負(fù)責(zé)實(shí)現(xiàn)消息循環(huán)的對(duì)象,普通的Java.Thread線程內(nèi)部是沒(méi)有這樣一個(gè)消息循環(huán)對(duì)象的,Android專門提供了HandlerThread封裝這種帶消息循環(huán)機(jī)制的線程。Handler通過(guò)與線程的Looper對(duì)象綁定,來(lái)完成與該Thread的綁定。

Callback則是由工作線程內(nèi)部傳出接收到的消息的回調(diào)接口,其他線程通過(guò)Handler的sendMessage發(fā)送消息給工作線程后,工作線程就會(huì)通過(guò)Callback將接收到的消息通知給監(jiān)聽(tīng)者。

注意:默認(rèn)情況下,如果new Handler()的時(shí)候,沒(méi)有傳入某個(gè)線程的Looper對(duì)象(或傳入null),系統(tǒng)就會(huì)默認(rèn)綁定到創(chuàng)建Handler()對(duì)象的線程中。

那么,現(xiàn)在可以回答第二個(gè)問(wèn)題了,在Activity里new Handler()和在自己創(chuàng)建的Thread中new Handler()有什么區(qū)別?

答案:

Activiy默認(rèn)是工作在主線程中的,所以在Activity中new Handler()后,該Handler對(duì)象默認(rèn)綁定了主線程的Looper對(duì)象,因此該Handler.sendMessage消息發(fā)送給了主線程,而且通過(guò)傳入Callback對(duì)象得到的handleMessage()回調(diào)也是工作在主線程,這就是為什么可以通過(guò)在Activity里使用如下方式更新UI而不會(huì)導(dǎo)致ANR了:

new Handler( new Handler.Callback() {			
    @Override
    public boolean handleMessage(Message msg) {				
        UpdateUI();
        return false;
    }
});

同理,如果在自定義線程中 new Handler(),則默認(rèn)情況該Handler()綁定了該線程的Looper對(duì)象,因此該Handler.sendMessage消息則是發(fā)送給了這個(gè)線程,而且通過(guò)傳入Callback對(duì)象得到的handleMessage()回調(diào)也是工作在這個(gè)線程,因此,這種情況下的handleMessage()函數(shù)中就不能進(jìn)行UI更新操作了,否則會(huì)導(dǎo)致ANR了。

以上是“Android開(kāi)發(fā)中常見(jiàn)問(wèn)題有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(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