handler+looper傳值更改activity的UIreact
博客開了一段時間,一直想寫點本身的學習經驗及體會,等着之後長時間不用再要用到的時候直接拿過來上手。想了想,以前用到handler,android
看了幾篇文章感受不是很詳細。今天就來說講handler。json
android用handler傳值更改UI有兩個目的:1、從用戶體驗方面考慮,把繁雜的操做和計算過程放到其餘線程,是主線程(用戶界面)更安全
加的流暢,減小出現卡頓現象。ide
2、確保線程安全,只有主線程能更改UI;oop
利用handler傳值,須要建立looper對象(系統在建立主線程(activity)的時候,在activity內部封裝了一個looper對象,即看不到新建學習
looper對象),系統會爲每一個looper建立an一個消息隊(messagequene),經過handler的sendmessage方法發送消息給該looper的消息ui
隊列,而後在該線程中,handler會從消息隊列中取出message,經過message.what來判斷接收的message進行什麼操做(更改該線程的ui等)。spa
若是你想在其餘的線程裏面進行操做以後發message給UI線程改變UI,就必需要確保你的handler發送的消息必須發送到該UI線程的消息隊列(messagequene),線程
最簡單的辦法就是使用UI線程的handler進行發送message(即sendmessage),下面說兩種方法使操做的線程得到UI線程的handler:
1、在操做線程中:Handler handler=MainActivity.handler;若是你要更改UI,就要在MainActivity裏面
定義一個handler屬性而且要是靜態的(static),這樣把handler的實例化最好放在oncreact方法裏面
(固然,handler實例化能夠放在類裏面的任何地方),在handler的實例化對象裏面重寫 handleMessage(Message msg)
方法,在handleMessage方法裏面進行接收消息並進行操做改變UI。
2、定義一個有handler屬性的類,在類裏面添加get和set方法用來獲取和實例化handler;
下面看代碼吧:
UI線程
public class MainActivity extends DroidGap { public static Handler handler; @Override public void onCreate(Bundle savedInstanceState) { // Be sure to call the super class. super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == 100) { //這裏面寫代碼更改UI } else if (msg.what == 101) { //這裏面寫代碼更改UI } else if (msg.what == 102) { } }
操做類:
public boolean add(JSONArray json) { try { JSONArray jsonArray=json.getJSONArray(0); JSONObject jsonObject= (JSONObject) (jsonArray.get(0)); final PrintItem printItem=new PrintItem(jsonObject.getString("product"),jsonObject.getInt("count"),jsonObject.getInt("price")); list.add(printItem); handler=MainActivity.handler; Message message=new Message(); message.what=100; message.obj=printItem; handler.sendMessage(message); return true; } catch (Exception e) { e.printStackTrace(); } return false; }