Android之旅–Handler與多線程

來源:互聯網
上載者:User

      本文首先解釋一下handler是用來幹嘛的,然後通過例子介紹其在多線程中的應用。

什麼是Handler

     handler通俗一點講就是用來在各個進程之間發送資料的處理對象。在任何進程中,只要獲得了另一個進程的handler則可以通過handler.sendMessage(message)方法向那個進程發送資料。基於這個機制,我們在處理多線程的時候可以建立一個thread,這個thread擁有UI線程中的一個handler。當thread處理完一些耗時的操作後通過傳遞過來的handler像ui線程發送資料,由UI線程去更新介面。

 

handler應用多線程例子

 

    我們這個例子是實現一個簡單的詞典功能。在擷取網頁過程中應用線程。這個程式共有兩個activity,第一個用於輸入查詢的單詞,第二個activity用於顯示結果。我們直接看第二個activity的內容。(第一個activity無非是獲得使用者輸入的單詞然後傳給activity2,還沒有掌握的可以看我前面的文章)

    首先來看OnCreate:

@Overrideprotected 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,它的處理常式是實現了callback的類,這裡我將這個activity繼承了// callback,所以可以傳入this。handler = new Handler(this);// 建立一個線程(我們自己實現的線程),將上面的handler和查詢的單詞傳入建構函式GetHtmlThread thread = new GetHtmlThread(handler, getIntent().getStringExtra("query"));// 開始線程thread.start();progressBar = (ProgressBar) findViewById(R.id.prb);progressBar.setVisibility(View.VISIBLE);}

一些必要的注釋我已經在代碼註明了。代碼中的那個GetHtmlThread線程是繼承於Thread的一個類,然後自己實現裡面的run方法,這個和c#裡面不一樣。感覺還是c#裡面好理解一點。那我們就看看這個GetHtmlThread類:

 

public class GetHtmlThread extends Thread{private Handler handler; // 傳入的handlerString queryKey; // 要查詢的單詞public GetHtmlThread(Handler handler, String queryKey){this.handler = handler;this.queryKey = queryKey;}@Overridepublic void run() // 線程處理的內容{// 獲得網頁中關於這個詞的解釋,返回的網頁內容String a = GetTranslateHtml(queryKey);// 定義一個訊息,用於發給UI線程的handler處理Message msg = new Message();Bundle bundle = new Bundle();// 將查詢的結果放進msg中bundle.putString("answer", a);msg.setData(bundle);// 設定這個msg的標識,這樣UI中的handler才能根據這個更改對應的UImsg.what = 0;// 將訊息發送給UI中的handler處理handler.sendMessage(msg);super.run();}}

 

 

現線上程中的訊息發送出去了。我們再到UI線程中處理這個訊息。代碼如下:

/** * 繼承了callback後,必須要實現這個方法。即上面那個handler的處理都在這裡進行 */@Overridepublic boolean handleMessage(Message msg){// 通過判斷msg.what來判斷到底是哪個"事件"要進行處理switch (msg.what){case 0:progressBar.setVisibility(View.GONE);// 拿出msg中的資料並顯示出來Bundle bundle = msg.getData();tvResult.setText(bundle.getString("answer"));break;default:break;}return false;}

 

這樣我們就可以看到當第二個activity顯示一段時間後網頁才顯示出來,並沒有出現卡死的情況!

最後再來梳理下多執行緒的步驟:

 

 

Demo下載

 

       Demo下載

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.