Android中的Handler與多線程應用實例
本文首先解釋一下handler是用來干嘛的,然后通過例子介紹其在多線程中的應用。
什么是Handler
handler通俗一點講就是用來在各個進程之間發(fā)送數(shù)據的處理對象。在任何進程中,只要獲得了另一個進程的handler則可以通過handler.sendMessage(message)方法向那個進程發(fā)送數(shù)據?;谶@個機制,我們在處理多線程的時候可以新建一個thread,這個thread擁有UI線程中的一個handler。當thread處理完一些耗時的操作后通過傳遞過來的handler像ui線程發(fā)送數(shù)據,由UI線程去更新界面。
handler應用多線程例子
我們這個例子是實現(xiàn)一個簡單的詞典功能。在獲取網頁過程中應用線程。這個程序共有兩個activity,第一個用于輸入查詢的單詞,第二個activity用于顯示結果。我們直接看第二個activity的內容。(第一個activity無非是獲得用戶輸入的單詞然后傳給activity2,還沒有掌握的可以看我前面的文章)
首先來看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()));
// 聲明一個handler,它的處理程序是實現(xiàn)了callback的類,這里我將這個activity繼承了
// callback,所以可以傳入this。
handler = new Handler(this);
// 新建一個線程(我們自己實現(xiàn)的線程),將上面的handler和查詢的單詞傳入構造函數(shù)
GetHtmlThread thread = new GetHtmlThread(handler, getIntent()
.getStringExtra("query"));
// 開始線程
thread.start();
progressBar = (ProgressBar) findViewById(R.id.prb);
progressBar.setVisibility(View.VISIBLE);
}
一些必要的注釋我已經在代碼注明了。代碼中的那個GetHtmlThread線程是繼承于Thread的一個類,然后自己實現(xiàn)里面的run方法,這個和c#里面不一樣。感覺還是c#里面好理解一點。那我們就看看這個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() // 線程處理的內容
{
// 獲得網頁中關于這個詞的解釋,返回的網頁內容
String a = GetTranslateHtml(queryKey);
// 定義一個消息,用于發(fā)給UI線程的handler處理
Message msg = new Message();
Bundle bundle = new Bundle();
// 將查詢的結果放進msg中
bundle.putString("answer", a);
msg.setData(bundle);
// 設置這個msg的標識,這樣UI中的handler才能根據這個更改對應的UI
msg.what = 0;
// 將消息發(fā)送給UI中的handler處理
handler.sendMessage(msg);
super.run();
}
}
現(xiàn)在線程中的消息發(fā)送出去了。我們再到UI線程中處理這個消息。代碼如下:
/**
* 繼承了callback后,必須要實現(xiàn)這個方法。即上面那個handler的處理都在這里進行
*/
@Override
public boolean handleMessage(Message msg)
{
// 通過判斷msg.what來判斷到底是哪個"事件"要進行處理
switch (msg.what)
{
case 0:
progressBar.setVisibility(View.GONE);
// 拿出msg中的數(shù)據并顯示出來
Bundle bundle = msg.getData();
tvResult.setText(bundle.getString("answer"));
break;
default:
break;
}
return false;
}
這樣我們就可以看到當?shù)诙€activity顯示一段時間后網頁才顯示出來,并沒有出現(xiàn)卡死的情況!
最后再來梳理下多線程處理的步驟:

相關文章
Android實現(xiàn)發(fā)送短信驗證碼倒計時功能示例
本篇文章主要介紹了Android實現(xiàn)發(fā)送短信驗證碼倒計時功能示例,這里整理了詳細的代碼,有需要的小伙伴可以參考下。2017-03-03
Android Studio3.6新特性之視圖綁定ViewBinding使用指南
這篇文章主要介紹了Android Studio3.6新特性之視圖綁定ViewBinding使用指南,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03
ProgressBar、ProgessDialog-用法(詳解)
下面小編就為大家?guī)硪黄狿rogressBar、ProgessDialog-用法(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06
Android開發(fā)中l(wèi)ibs和jinLibs文件夾的作用詳解
這篇文章主要給大家介紹了關于Android開發(fā)中l(wèi)ibs和jinLibs文件夾的作用的相關資料,文中通過圖文及示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧。2017-09-09
Android帶進度條的文件上傳示例(使用AsyncTask異步任務)
這篇文章主要介紹了Android帶進度條的文件上傳示例(使用AsyncTask異步任務),使用起來比較方便,將幾個方法實現(xiàn)就行,感興趣的小伙伴們可以參考一下。2016-11-11

