首先在app的bulid.gradle中引入以下三個包
implementation 'com.squareup.okhttp3:okhttp:4.3.0'
implementation 'com.squareup.okio:okio:2.4.3'
implementation 'com.zhy:okhttputils:2.6.2'
然後在想進行網絡請求的地方使用okhttpUtils構造即可,下面將分別以異步請求和同步請求的實例說明:
異步請求(登錄功能爲例):
OkHttpUtils
.post()
.url(host)
.addParams("account", username)
.addParams("password", password)
.build()
.execute(new StringCallback() {
@Override
public void onError(Call call, Exception e, int id) {
Toasty.error(Login_page.this, "服務器請求失敗", Toast.LENGTH_SHORT, true).show();
}
@Override
public void onResponse(String response, int id) {
try {
JSONObject jsonObject = new JSONObject(response);
int code = jsonObject.getInt("code");
if (code==200) {
Toasty.success(Login_page.this,jsonObject.getString("msg"), Toast.LENGTH_SHORT, true).show();
finish();
} else {
Toasty.error(Login_page.this,jsonObject.getString("msg"), Toast.LENGTH_SHORT).show();
}
} catch (JSONException e) {
e.printStackTrace();
Toasty.warning(Login_page.this,"登錄失敗",Toast.LENGTH_LONG).show();
}
}
});
同步請求(更新用戶數據功能爲例):
try {
Response response = OkHttpUtils
.post()
.url(userInfo_host)
.addParams("token", token)
.build()
.execute();
if(response.isSuccessful()){
JSONObject jsonObject = new JSONObject(response.body().string());
int code = jsonObject.getInt("code");
if (code==200) {
//這裏進行獲取數據的內存寫入,不進行展示了
} else {
Toasty.error(Zhujiemian.this,jsonObject.getString("msg"), Toast.LENGTH_SHORT).show();
}
}
} catch (IOException e) {
Toasty.warning(Zhujiemian.this,"服務器請求失敗,無法更新用戶信息",Toast.LENGTH_SHORT).show();
} catch (JSONException e) {
Toasty.info(Zhujiemian.this,"服務器數據解析失敗", Toast.LENGTH_SHORT).show();
值得說明的是安卓4之後就不允許在主線程中進行同步網絡請求避免響應時間過長引起的ANR,所以有兩個方案解決,一是將網絡請求放入子線程中進行,並通過handle更新UI。二是修改安全策略,強行在主線程中進行同步網絡請求,但一定注意第二種方案一定是在數據量少的情況下,比如我實例代碼中通過token獲取用戶基本信息這種情況,我便採用了修改安全策略的方案,即在oncreate中添加如下代碼:
//允許高版本安卓主線程網絡請求
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);