okHttp異步請(qǐng)求與UI主線程同步的例子
需求:在搜索框輸入省或城市名字,調(diào)用網(wǎng)絡(luò)接口獲取其下的城市或區(qū)的id與名字,名字作為數(shù)據(jù)源加載到bottomsheetdialog里的聯(lián)想列表(一個(gè)recyclerview)上。調(diào)用網(wǎng)絡(luò)接口是一個(gè)異步操作,和UI的加載是同時(shí)進(jìn)行的,目的是為了防止請(qǐng)求失敗導(dǎo)致主線程阻塞。而正確邏輯應(yīng)當(dāng)是通過網(wǎng)絡(luò)接口獲取到非空數(shù)據(jù)源后,才開始初始化適配器。
解決辦法:在網(wǎng)絡(luò)請(qǐng)求成功的回調(diào)方法里初始化適配器。
【UI主線程內(nèi)容】
僅僅包括一個(gè)bottomsheetdialog的初始化和軟鍵盤搜索監(jiān)聽事件。這個(gè)監(jiān)聽事件是發(fā)起okHttp異步請(qǐng)求的,不要在它的后面加載需要網(wǎng)絡(luò)數(shù)據(jù)源的UI。
【okHttp請(qǐng)求方法】
基本步驟:實(shí)例化請(qǐng)求OkHttpClient,拼接URL,發(fā)起異步請(qǐng)求隊(duì)列,new一個(gè)回調(diào)
在回調(diào)里就可以使用runOnUIThread(?( )->{ }?)向主線程添加代碼塊,也就是初始化適配器的操作,并彈出bottomsheetdialog。
【補(bǔ)充】
【軟鍵盤隱藏方法】
【適配器的條目監(jiān)聽】
基本步驟:聲明監(jiān)聽,set方法,暴露接口,綁定視圖
本文出現(xiàn)了三個(gè)lambda表達(dá)式,依次是:
1.適配器里的setOnClickListenr(?v -> {}?) v代表?xiàng)l目視圖,代替的是
2.初始化條目監(jiān)聽里的onItemClickListener = position -> { },含義和上面一樣
3.線程同步里的runOnUiThread(()-> { }
【Gson的使用】
天氣預(yù)報(bào)的網(wǎng)絡(luò)數(shù)據(jù)量很大,而且Json字符串非常亂,要把這樣的Json手動(dòng)轉(zhuǎn)化為Java對(duì)象太繁瑣,于是引入Gson自動(dòng)序列化生成java對(duì)象或者反序列化。例如
而自動(dòng)生成的實(shí)體類的屬性名和字段名是完全相同的,開發(fā)框架會(huì)自動(dòng)幫我們映射。