a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 系統 > Android > 正文

Android中的Handler與多線程應用實例

2020-04-11 11:38:36
字體:
來源:轉載
供稿:網友

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

什么是Handler

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

handler應用多線程例子

我們這個例子是實現一個簡單的詞典功能。在獲取網頁過程中應用線程。這個程序共有兩個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,它的處理程序是實現了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; // 傳入的handler
  String queryKey; // 要查詢的單詞

  public GetHtmlThread(Handler handler, String queryKey)
  {
   this.handler = handler;
   this.queryKey = queryKey;
  }

  @Override
  public 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才能根據這個更改對應的UI
   msg.what = 0;
   // 將消息發送給UI中的handler處理
   handler.sendMessage(msg);
   super.run();
  }
 }

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

復制代碼 代碼如下:

/**
  * 繼承了callback后,必須要實現這個方法。即上面那個handler的處理都在這里進行
  */
 @Override
 public 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下載

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美在线视频不卡 | 亚洲视频www | 欧美精品久久久久久久久久丰满 | 国产精品日韩欧美一区二区三区 | 毛片天堂| 欧美日韩一区在线 | 青草青草久热精品视频在线观看 | 成人看的免费视频 | 91麻豆产精品久久久久久 | 亚洲国产情侣自拍 | 久久久久av | 久久国产亚洲精品 | 欧美性一区二区三区 | 成人国产精品久久久 | 一级一级一级一级毛片 | 国产亚洲精品久久 | 亚洲精品视频在线 | 久久国产精品亚洲 | 欧美日本国产 | 色综合成人 | 久久久成人av | 韩日一区二区 | 久久天天躁狠狠躁夜夜躁2014 | 国产精品毛片 | 91精品国产综合久久精品 | 日韩一级免费观看 | 国产精品综合视频 | 99久久久国产精品免费蜜臀 | 欧洲另类在线1 | 亚洲午夜精品一区二区三区他趣 | 国产精品11 | 一二三区视频 | 国产精品成av人在线视午夜片 | 操操操操网| 日本一区二区不卡 | 一区二区精品视频 | 日本在线一区二区 | 亚洲欧美日韩精品久久亚洲区 | 精品欧美一区二区在线观看视频 | 亚洲一区二区三区观看 | 最新av在线网址 |