?? 最近在項(xiàng)目過程中使用到了okhttp網(wǎng)絡(luò)框架嫉父,在給服務(wù)器以post鍵值對(duì)方式提交數(shù)據(jù)時(shí)服務(wù)器一直給空指針的異常吞瞪,心想這次終于也發(fā)現(xiàn)后臺(tái)人員的鍋了,哈哈桃焕,但出于負(fù)責(zé)任自己用接口測(cè)試工具請(qǐng)求數(shù)據(jù)竟然沒錯(cuò)誤亏钩,細(xì)心一想著者很可能是是自己前端的問題莲绰,于是開始排查問題。
?? 在debug模式下發(fā)現(xiàn)三個(gè)參數(shù)的鍵值都是一樣的姑丑,what?怎么可能蛤签,細(xì)心看了自己的代碼鍵值也沒有錯(cuò)誤,于是開始看傳的參數(shù)的構(gòu)造方法栅哀,果不其然網(wǎng)絡(luò)請(qǐng)求框架中的Prams類被定義為了靜態(tài)內(nèi)部類震肮,其成員變量也被定義為靜態(tài)的,估計(jì)是之前同事沒有 很好的理解java中靜態(tài)成員變量的加載過程留拾,導(dǎo)致我在構(gòu)造很多了參數(shù)是出現(xiàn)了問題戳晌。
我在構(gòu)造參數(shù)時(shí)直接這樣使用:
OKHttpUtils.Paramparam=newOKHttpUtils.Param("startId", startId);
OKHttpUtils.ParamparamPage=newOKHttpUtils.Param("rows", pageSize +"");
OKHttpUtils.ParamparamSearchId=newOKHttpUtils.Param("searchId", searchId);
OKHttpUtils.Param[]pa=newOKHttpUtils.Param[]{param,paramPage,paramSearchId};
下邊是構(gòu)造參數(shù)的過程
Builderbuilder=newBuilder();
for(Paramparam: params) {
builder.add(param.key,param.value);
Log.i("okhttp",param.key);
}
熟悉java類加載的過程的同學(xué)看到這里,肯定知道了問題的所在痴柔,靜態(tài)成員變量是存儲(chǔ)方法 區(qū)內(nèi)存中沦偎,而且只會(huì)存在一份數(shù)據(jù)。所以說我打印出來的param.key值三個(gè)都是 searchId,所以服務(wù)器也會(huì)報(bào)空指針的錯(cuò)誤,最后把static 關(guān)鍵字給去掉豪嚎,加上gette或者setter就解決了搔驼。