日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android 多个handler,Android中的Handler与多线程应用实例

發(fā)布時間:2023/12/15 Android 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 多个handler,Android中的Handler与多线程应用实例 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

什么是Handler

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

handler應用多線程例子

我們這個例子是實現(xiàn)一個簡單的詞典功能。在獲取網(wǎng)頁過程中應用線程。這個程序共有兩個activity,第一個用于輸入查詢的單詞,第二個activity用于顯示結(jié)果。我們直接看第二個activity的內(nèi)容。(第一個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和查詢的單詞傳入構(gòu)造函數(shù)

GetHtmlThread thread = new GetHtmlThread(handler, getIntent()

.getStringExtra("query"));

// 開始線程

thread.start();

progressBar = (ProgressBar) findViewById(R.id.prb);

progressBar.setVisibility(View.VISIBLE);

}

一些必要的注釋我已經(jīng)在代碼注明了。代碼中的那個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() // 線程處理的內(nèi)容

{

// 獲得網(wǎng)頁中關(guān)于這個詞的解釋,返回的網(wǎng)頁內(nèi)容

String a = GetTranslateHtml(queryKey);

// 定義一個消息,用于發(fā)給UI線程的handler處理

Message msg = new Message();

Bundle bundle = new Bundle();

// 將查詢的結(jié)果放進msg中

bundle.putString("answer", a);

msg.setData(bundle);

// 設(shè)置這個msg的標識,這樣UI中的handler才能根據(jù)這個更改對應的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ù)據(jù)并顯示出來

Bundle bundle = msg.getData();

tvResult.setText(bundle.getString("answer"));

break;

default:

break;

}

return false;

}

這樣我們就可以看到當?shù)诙€activity顯示一段時間后網(wǎng)頁才顯示出來,并沒有出現(xiàn)卡死的情況!

最后再來梳理下多線程處理的步驟:

總結(jié)

以上是生活随笔為你收集整理的android 多个handler,Android中的Handler与多线程应用实例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。