標籤:
上一篇已經簡單為大家介紹了一下關於Handler的使用,本篇我們就一起再來探討一下Handler的進階使用,上一篇我們僅僅是簡單的進行UI介面的更新,本篇我們來一起探討一下如何把子線程的資料發送到主線程進行處理,對於這個問題,我想一定有很多小夥伴困擾過,其實這很簡單的,我之前和大家一樣感覺在從子線程發送到主線程是不可能的,不過現在可以真正否定我之前的觀點了,子線程向主線程發送資料是完全沒問題的。好了,廢話不多說,下面我們就一起來探討一下吧。
1、我們通過Handler和Message來完成:
/* * 傳遞int型資料 */ new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } Message msg = new Message(); //mes.arg1、mes.arg2、mes.what:均只能傳int型資料 msg.arg1 = 1; msg.arg2 = 2; msg.what = 3; handler.sendMessage(msg); } }).start();
處理Message發送過來的資料:
//聲明一個Handler對象,並實現其中的handleMessage()方法private Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { if(msg.what==3){ textview.setText("msg.arg1:"+msg.arg1+" msg.arg2:"+msg.arg2); }else{ if(msg.what==2){ Person person = (Person) msg.obj; textview.setText("姓名:"+person.getName()+" 性別:"+person.getSex()+" 年齡:"+person.getYear()); } } }; };
2、Message的使用:
上面我們向Handler發送的資料均為Int資料,這當然無法滿足我們的日常需求,那如何通過Message向Handler發送一個Object資料呢?大家不要擔心Message為我們封裝了一個obj()方法,方便我們傳遞資料。
new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } Person person = new Person(); person.setName("小王"); person.setSex("girl"); person.setYear(22); Message msg = new Message(); msg.what = 2; msg.obj = person; handler.sendMessage(msg); } }).start();}
Person是我封裝的一個對象:
public class Person { private String name; private String sex; private int year; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getYear() { return year; } public void setYear(int year) { this.year = year; }}
對於這個Message的資料的處理,已經在上面的為大家展示。
看到這裡你是不是已經感覺到Handler的強大,確實當我們處理多線程問題時,Handler是非常方便的,感興趣的可以持續關注喲,下一篇更精彩。
Android線程處理之Handler