安卓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);
发布了29 篇原创文章 · 获赞 1 · 访问量 7816

猜你喜欢

转载自blog.csdn.net/qq_38280150/article/details/104151064