十年網站開發(fā)經驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網站問題一站解決
前言
成都創(chuàng)新互聯公司-專業(yè)網站定制、快速模板網站建設、高性價比惠城網站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式惠城網站制作公司更省心,省錢,快速模板網站建設找我們,業(yè)務覆蓋惠城地區(qū)。費用合理售后完善,10多年實體公司更值得信賴。
在android開發(fā)中,界面UI的更新都是在主線程來完成的。線程分為主線程(Main Thread,簡稱MT)和工作線程(Work Thread,簡稱WT),我們通常會在WT中執(zhí)行一些比較耗時的操作,比如下載,網絡,緩存等,然后在將結果發(fā)送給MT進行UI的更新操作。如果是在WT進行UI的更新,則會拋出異常,android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.(只有創(chuàng)建這個View的原始線程才能修改這個view)。
在BT搜索、WIFI搜索、其他需要更新View的UI過程中,很多是采用廣播的方式通知搜索的結果,實時的顯示到listview中進行UI的更新操作。通常會使用以下幾種方式進行UI的更新:handler,runOnUiThread,子線程發(fā)送Message。
一、Activity.runOnUiThread
利用Activity.runOnUiThread(Runnable)把更新ui的代碼創(chuàng)建在Runnable中,然后在需要更新 ui時,把這個Runnable對象傳給Activity.runOnUiThread(Runnable)。這樣Runnable對像就能在ui程序中被調用。如果當前線程是UI線程,那么行動是立即執(zhí)行。如果當前線程不是UI線程,操作是發(fā)布到事件隊列的UI線程。
mActivity.runOnUiThread(new Runnable() { @Override public void run() { Log.e(TAG, "開始添加設備!"); addDevice(device); } });
二、handler.post(Runnable)
handler.post(new Runnable() { @Override public void run() { addDevice(device); } });
三、子線程發(fā)送Message
首先在需要執(zhí)行更新的位置添加以下代碼
new Thread(new Runnable() { @Override public void run() { //Message msg = new Message(); //msg.what = 0x06; //handler.sendMessage(msg); handler.sendEmptyMessage(0x06); } }).start();
然后進入handler下進行處理
final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case 0x06: addDevice(device); break; default: break; } super.handleMessage(msg); } };
以上三種方法都可以實現UI的更新,掌握哪種方式取決于代碼中的疊加度,不過個人推薦使用方法一。希望對大家的學習有所幫助,也希望大家多多支持創(chuàng)新互聯。