標籤:android開發 線程 ui
在Android開發過程中,常需要更新介面的UI。比如網路請求操作、一些耗時操作都不能放在UI線程中啟動並執行,需要放在子線程,而子線程又不能更新UI介面,這是我們需要引入一個Handler,訊息處理機制。更新UI是要主線程(UI線程)來更新的,即UI線程更新。如果在主線線程之外的線程中直接更新頁面顯示常會報錯。拋出異常:android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
只有原始建立這個視圖層次(view hierachy)的線程才能修改它的視圖(view)
下面有這兩種方法來更新UI介面。1、建立一個Handler類的執行個體,然後實現這個類中handleMessage()回呼函數,在這個回呼函數中來操作更新UI介面,然後它是怎麼知道什麼時候要更新介面呢?就需要通過Handler發送一個訊息給訊息佇列。mHandler.sendEmptyMessage(what);來辨別具體更新什麼UI介面。
private Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what) {case GET2CODE_SUCCESS:dialog.dismiss();set2CodeShow();break;case CONN_FAILED:dialog.dismiss();set2CodeShow();Toast.makeText(GoodsInfo.this, "串連失敗", Toast.LENGTH_SHORT).show();break;default:break;}}};mHandler.sendEmptyMessage(GET2CODE_SUCCESS);或者建立一個訊息對象,Message msg = new Message();msg.what=GET2CODE_SUCCESS;然後通過mHandler.sendMessage(msg);來發送訊息給訊息佇列,當然也可以發送對象資料,即用msg.obj= Object來發送對象。
2、利用Activity.runOnUiThread(new Runnable{run(){}})把更新需要的UI代碼建立在run()方法中,這個其實原理也是通過Handler來發送訊息給主線程的。
Android更新UI的兩種方法——handler與runOnUiThread()