Android網路請求完成之後更新UI的幾種方法

2021-08-28 10:01:23 字數 1365 閱讀 8451

首先我們需要明確幾點:

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...