這個仿網(wǎng)易新聞app系列博客要開寫了,首先要先說明一下,這個系列博客是給基礎(chǔ)進階的小伙伴們看的,也就是說你看之前,必須了解android的四大組件,對于網(wǎng)絡(luò)編程,第三方框架有一個基礎(chǔ)的了解,所以這里對于基礎(chǔ)知識基本不會詳細展開,敬請諒解。
還有由于最近工作繁忙,這系列博客可能會寫的簡單點,但會把基本的技術(shù)要點都過一遍。
網(wǎng)絡(luò)封裝
這個項目中使用的網(wǎng)絡(luò)請求工具是httpConnect,通過自己簡單封裝實現(xiàn)的,礙于個人能力問題,可能封裝的不夠好,但是基本夠用了。
另外httpConnect在android6.0已經(jīng)被棄用了,所以在使用的時候記得在module的gradle文件的android中添加useLibrary 'org.apache.http.legacy',這時才能導(dǎo)入。
網(wǎng)絡(luò)封裝核心類
HttpCallbackListener:網(wǎng)絡(luò)請求回掉接口
HttpClientFactory:網(wǎng)絡(luò)請求工廠類,設(shè)置http請求的各項參數(shù),如超時時間,請求失敗重試次數(shù)等等
HttpRequestCode:網(wǎng)絡(luò)請求狀態(tài)碼描述,根據(jù)網(wǎng)絡(luò)請求返回的狀態(tài)碼,返回狀態(tài)碼的描述信息,用于返回錯誤信息,如網(wǎng)絡(luò)請求返回了404,將404傳入就返回requestCode: 404 -- Not Found字符串
HttpHelper:最核心的一個封裝類,網(wǎng)絡(luò)請求的方法都在這里。
首先我們分析按照網(wǎng)絡(luò)請求框架的一般方法,如okhttp之類的,發(fā)現(xiàn)在發(fā)出請求之后,會強制實現(xiàn)兩個方法,即請求成功和請求失敗兩種情況的結(jié)果,因此我們需要成功和失敗的兩個接口,代碼如下:
public interface HttpCallbackListener {
void onSuccess(String result);
void onError(Exception e);
}
HttpHelper類
這個類需要詳細了解一下,里面是執(zhí)行網(wǎng)絡(luò)操作的具體方法,如使用get請求或者使用post,當(dāng)然,其中最重要的是execute()方法,代碼如下:
private static void execute(String url, HttpRequestBase requestBase, HttpCallbackListener httpCallbackListener) {
boolean isHttps = url.startsWith("https://");//判斷是否需要采用https
AbstractHttpClient httpClient = HttpClientFactory.create(isHttps);
HttpContext httpContext = new SyncBasicHttpContext(new BasicHttpContext());
HttpRequestRetryHandler retryHandler = httpClient.getHttpRequestRetryHandler();//獲取重試機制
int retryCount = 0;
boolean retry = true;
while (retry) {
try {
HttpResponse response = httpClient.execute(requestBase, httpContext);//訪問網(wǎng)絡(luò)
int stateCode = response.getStatusLine().getStatusCode();
if (response != null) {
if (stateCode == HttpURLConnection.HTTP_OK){
HttpResult httpResult = new HttpResult(response, httpClient, requestBase);
String result = httpResult.getString();
if (!TextUtils.isEmpty(result)){
httpCallbackListener.onSuccess(result);
return;
} else {
throw new RuntimeException("數(shù)據(jù)為空");
}
} else {
throw new RuntimeException(HttpRequestCode.ReturnCode(stateCode));
}
}
} catch (Exception e) {
IOException ioException = new IOException(e.getMessage());
retry = retryHandler.retryRequest(ioException, ++retryCount, httpContext);//把錯誤異常交給重試機制,以判斷是否需要采取從事
LogUtils.e(TAG, "重復(fù)次數(shù):" + retryCount + " :"+ e);
if (!retry){
httpCallbackListener.onError(e);
}
}
}
}
在這里我們使用httpClient執(zhí)行網(wǎng)絡(luò)請求,當(dāng)網(wǎng)絡(luò)請求正確,并且返回的狀態(tài)碼為200的時候,此時得到正確的結(jié)果,調(diào)用HttpCallbackListener.onSuccess()方法返回數(shù)據(jù),如果重試多次仍然失敗就調(diào)用httpCallbackListener.onError(e);方法。
最后我們只需要調(diào)用HttpHelper.get()就可以請求網(wǎng)絡(luò)了。
以上就是網(wǎng)絡(luò)請求的基本內(nèi)容了!