隨感一:android handler傳值更改ui

   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;
}

 
相關文章
相關標籤/搜索