首先我們需要明確幾點:
1、網路請求因為是耗時操作,不能再主線程中進行,所以只能在子執行緒中進行
2、更新ui是必須在主線程中進行的
所以,我們要在網路請求之後更新ui需要做以下幾個步驟:
1、在主線程中new乙個子執行緒
2、在子執行緒中進行網路請求
3、網路請求結束之後更新ui
對於上面的3個步驟有兩種方法可以供選擇,乙個是採用thread和handler,另外一種就是採用asyntask。
(1)對於thread加handler,就是在子執行緒(thread)中完成載入之後,利用handler將網路請求得到的資料放在message中,並在handler中實現ui更新。
(2)對於asyntask,就是要重寫doinbackground()方法完成網路載入這樣的耗時操作,重寫onpostexecute()方法,因為onpostexecute()實在主線程中進行的,所以在onpostexecute()中進行ui的更新。下面的**是我的乙個例子,首先是類bitmaptask繼承自asynctask
class bitmaptask extends asynctask
/*** 耗時方法結束後執行該方法,主線程中
** @param result
*/@override
protected void onpostexecute(bitmap result) }}
/*** @param url
* @return
*/private bitmap downloadbitmap(string url)
} catch (ioexception e) finally
return null;
}
寫好asyntask之後,就是在主線程中呼叫asyntask的execute方法
new bitmaptask().execute(imageview1, url);//啟動asynctask
這樣就可以實現在網路請求完之後更新ui。
但是上面兩個方法都存在乙個問題就是:若我有兩個介面a和b,我的介面a需要在網路上獲取然後顯示在介面上,並且我在介面a中採用上面的兩個方法其中乙個,因為網路請求是耗時操作,並且什麼時候請求完成是說不准的,如果我在網路請求還沒有結束的時候切換到了介面b,這時如果在網路結束要更新ui了,但是此時的介面是b,那麼程式就會報錯。
對於這個問題的解決辦法就是:
(1)載入介面時顯示之前快取的介面,在下拉重新整理中進行網路請求和更新ui
(2)設定乙個public static int flag;用flag來標誌當前是介面a還是介面b,若網路載入完成時是介面a,再進行ui更新
這兩個方法各有適用場合,根據實際場合進行選擇。
Android網路請求完成之後更新UI的幾種方法
首先我們需要明確幾點 1 網路請求因為是耗時操作,不能再主線程中進行,所以只能在子執行緒中進行 2 更新ui是必須在主線程中進行的 所以,我們要在網路請求之後更新ui需要做以下幾個步驟 1 在主線程中new乙個子執行緒 2 在子執行緒中進行網路請求 3 網路請求結束之後更新ui 對於上面的3個步驟有...
android原始碼編譯完成之後
android原始碼編譯完成之後,在根目錄下會有乙個out目錄生成,如果我們想要執行虛擬機器的話,需要配置一下環境變數 首先我們使用下面的命令開啟配置環境變數的檔案 gedit bashrc在這個檔案的最後,新增如下 export android product out android out ta...
Android非同步網路請求
安卓4.0版本以上不允許在主線程中進行網路請求,如果在主線程進行網路請求,會造成頁面假死,甚至程式異常。因此需要開乙個新執行緒來進行網路請求 開乙個新執行緒 new thread new runnable catch exception e start handler mhandler new ha...