安卓okhttp工具類okhttpUtils同步/異步請求實例

首先在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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章