前言
android網絡框架之OKhttp一個處理網絡請求的開源項目,是安卓端最火熱的輕量級框架,由移動支付Square公司貢獻(該公司還貢獻了Picasso)
用於替代HttpUrlConnection和Apache HttpClient(android API23 6.0裏已移除HttpClient)
官網的解釋如下:
基本用法
1.集成
1.1.依賴
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
可以去Okhttp-Github 查看並依賴最新的版本。
1.2權限
添加網絡權限
<uses-permission android:name="android.permission.INTERNET" />
2.使用
2.1 同步GET請求
- 構建OkHttpClient對象
- 構建Request對象
- 構建Call對象並通過
execute()
方法來執行同步Get請求
//同步請求
OkHttpClient okHttpClient=new OkHttpClient();
final Request request=new Request.Builder()
.url("https://www.wanandroid.com/navi/json")
.get()
.build();
final Call call = okHttpClient.newCall(request);
try {
Response response = call.execute();
Log.e("同步結果---- ",response.body().string()+"");
} catch (IOException e) {
e.printStackTrace();
}
運行後發現報錯:
android.os.NetworkOnMainThreadException
在Android4.0以後,會發現,只要是寫在主線程(就是Activity)中的HTTP請求,運行時都會報錯,這是因爲Android在4.0以後爲了防止應用的ANR(Aplication Not Response)異常。解決方法就是在子線程中運行:
//同步請求
OkHttpClient okHttpClient=new OkHttpClient();
final Request request=new Request.Builder()
.url("https://www.wanandroid.com/navi/json")
.get()
.build();
final Call call = okHttpClient.newCall(request);
new Thread(new Runnable() {
@Override
public void run() {
try {
Response response = call.execute();
Log.e("同步結果---- ",response.body().string()+"");
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
2.2 異步GET請求
//異步請求
OkHttpClient okHttpClient=new OkHttpClient();
final Request request=new Request.Builder()
.url("https://www.wanandroid.com/navi/json")
.get()
.build();
final Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d("okhttp_error",e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Gson gson=new Gson();
Log.d("okhttp_success",response.body().string());
}
});
2.3 POST請求
POST請求支持提交文件,流,string,表單等等 。這裏拿POST表單請求作爲請求示例:
OkHttpClient okHttpClient = new OkHttpClient();
RequestBody requestBody = new FormBody.Builder()
.add("username", "qinzishuai")
.add("password", "111111")
.build();
Request request = new Request.Builder()
.url("https://www.wanandroid.com/user/login")
.post(requestBody)
.build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d("okhttp", "onFailure: " + e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d("okhttp", "onResponse: " + response.body().string());
}
});
大家可以關注我的微信公衆號:「秦子帥」一個有質量、有態度的公衆號!