Android中的Handler與多線程應(yīng)用實(shí)例
本文首先解釋一下handler是用來(lái)干嘛的,然后通過(guò)例子介紹其在多線程中的應(yīng)用。
什么是Handler
handler通俗一點(diǎn)講就是用來(lái)在各個(gè)進(jìn)程之間發(fā)送數(shù)據(jù)的處理對(duì)象。在任何進(jìn)程中,只要獲得了另一個(gè)進(jìn)程的handler則可以通過(guò)handler.sendMessage(message)方法向那個(gè)進(jìn)程發(fā)送數(shù)據(jù)?;谶@個(gè)機(jī)制,我們?cè)谔幚矶嗑€程的時(shí)候可以新建一個(gè)thread,這個(gè)thread擁有UI線程中的一個(gè)handler。當(dāng)thread處理完一些耗時(shí)的操作后通過(guò)傳遞過(guò)來(lái)的handler像ui線程發(fā)送數(shù)據(jù),由UI線程去更新界面。
handler應(yīng)用多線程例子
我們這個(gè)例子是實(shí)現(xiàn)一個(gè)簡(jiǎn)單的詞典功能。在獲取網(wǎng)頁(yè)過(guò)程中應(yīng)用線程。這個(gè)程序共有兩個(gè)activity,第一個(gè)用于輸入查詢的單詞,第二個(gè)activity用于顯示結(jié)果。我們直接看第二個(gè)activity的內(nèi)容。(第一個(gè)activity無(wú)非是獲得用戶輸入的單詞然后傳給activity2,還沒(méi)有掌握的可以看我前面的文章)
首先來(lái)看OnCreate:
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.queryresult);
tvResult = (TextView) findViewById(R.id.tvResult);
String queryString = getIntent().getStringExtra("query");
Log.d("threadId:", String.valueOf(Thread.currentThread().getId()));
// 聲明一個(gè)handler,它的處理程序是實(shí)現(xiàn)了callback的類,這里我將這個(gè)activity繼承了
// callback,所以可以傳入this。
handler = new Handler(this);
// 新建一個(gè)線程(我們自己實(shí)現(xiàn)的線程),將上面的handler和查詢的單詞傳入構(gòu)造函數(shù)
GetHtmlThread thread = new GetHtmlThread(handler, getIntent()
.getStringExtra("query"));
// 開(kāi)始線程
thread.start();
progressBar = (ProgressBar) findViewById(R.id.prb);
progressBar.setVisibility(View.VISIBLE);
}
一些必要的注釋我已經(jīng)在代碼注明了。代碼中的那個(gè)GetHtmlThread線程是繼承于Thread的一個(gè)類,然后自己實(shí)現(xiàn)里面的run方法,這個(gè)和c#里面不一樣。感覺(jué)還是c#里面好理解一點(diǎn)。那我們就看看這個(gè)GetHtmlThread類:
public class GetHtmlThread extends Thread
{
private Handler handler; // 傳入的handler
String queryKey; // 要查詢的單詞
public GetHtmlThread(Handler handler, String queryKey)
{
this.handler = handler;
this.queryKey = queryKey;
}
@Override
public void run() // 線程處理的內(nèi)容
{
// 獲得網(wǎng)頁(yè)中關(guān)于這個(gè)詞的解釋,返回的網(wǎng)頁(yè)內(nèi)容
String a = GetTranslateHtml(queryKey);
// 定義一個(gè)消息,用于發(fā)給UI線程的handler處理
Message msg = new Message();
Bundle bundle = new Bundle();
// 將查詢的結(jié)果放進(jìn)msg中
bundle.putString("answer", a);
msg.setData(bundle);
// 設(shè)置這個(gè)msg的標(biāo)識(shí),這樣UI中的handler才能根據(jù)這個(gè)更改對(duì)應(yīng)的UI
msg.what = 0;
// 將消息發(fā)送給UI中的handler處理
handler.sendMessage(msg);
super.run();
}
}
現(xiàn)在線程中的消息發(fā)送出去了。我們?cè)俚経I線程中處理這個(gè)消息。代碼如下:
/**
* 繼承了callback后,必須要實(shí)現(xiàn)這個(gè)方法。即上面那個(gè)handler的處理都在這里進(jìn)行
*/
@Override
public boolean handleMessage(Message msg)
{
// 通過(guò)判斷msg.what來(lái)判斷到底是哪個(gè)"事件"要進(jìn)行處理
switch (msg.what)
{
case 0:
progressBar.setVisibility(View.GONE);
// 拿出msg中的數(shù)據(jù)并顯示出來(lái)
Bundle bundle = msg.getData();
tvResult.setText(bundle.getString("answer"));
break;
default:
break;
}
return false;
}
這樣我們就可以看到當(dāng)?shù)诙€(gè)activity顯示一段時(shí)間后網(wǎng)頁(yè)才顯示出來(lái),并沒(méi)有出現(xiàn)卡死的情況!
最后再來(lái)梳理下多線程處理的步驟:
相關(guān)文章
Android編程實(shí)現(xiàn)GridView控件點(diǎn)擊圖片變暗效果的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)GridView控件點(diǎn)擊圖片變暗效果的方法,簡(jiǎn)單分析了GridView控件事件響應(yīng)及屬性操作的相關(guān)技巧,需要的朋友可以參考下2017-06-06Android P實(shí)現(xiàn)靜默安裝的方法示例(官方Demo)
這篇文章主要介紹了Android P實(shí)現(xiàn)靜默安裝,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02Android開(kāi)發(fā)常用經(jīng)典代碼段集錦
這篇文章主要介紹了Android開(kāi)發(fā)常用經(jīng)典代碼段,涉及Android開(kāi)發(fā)過(guò)程中針對(duì)手機(jī)、聯(lián)系人、圖片、存儲(chǔ)卡等的相關(guān)操作技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2016-02-02Android使用Handler實(shí)現(xiàn)打地鼠游戲
這篇文章主要為大家詳細(xì)介紹了Android使用Handler實(shí)現(xiàn)打地鼠游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06Android實(shí)現(xiàn)圓形漸變加載進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)圓形漸變加載進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09Android實(shí)現(xiàn)獲取短信驗(yàn)證碼并自動(dòng)填寫功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)獲取短信驗(yàn)證碼并自動(dòng)填寫功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07詳解Android應(yīng)用開(kāi)發(fā)中Intent的作用及使用方法
這篇文章主要介紹了Android應(yīng)用開(kāi)發(fā)中Intent的作用與用法,包括如何激活A(yù)ctivity組件與Intent的投遞等,需要的朋友可以參考下2016-03-03Android ViewPager制作新手導(dǎo)航頁(yè)(動(dòng)態(tài)加載)
這篇文章主要為大家詳細(xì)介紹了Android ViewPager制作新手導(dǎo)航頁(yè),了解什么是動(dòng)態(tài)加載指示器,感興趣的小伙伴們可以參考一下2016-05-05解決Android快速滑動(dòng)時(shí)圖片一閃一閃問(wèn)題
這篇文章主要給大家介紹了個(gè)人在解決Android快速滑動(dòng)時(shí)圖片一閃一閃問(wèn)題的一些思路和方法,非常實(shí)用,有需要的小伙伴可以參考下。2015-07-07