一起Talk Android吧(第三百三十八回: Android中的OkHttp一)

本文介绍了Android中HTTP库OkHttp的使用,包括其支持HTTP2、并发处理和缓存策略等优点。详细阐述了如何导入库、创建OkHttpClient对象、构建Request并发起同步和异步请求的步骤,并提供了示例代码。注意需添加网络权限,选择合适的请求类型,以及在主线程外发起同步请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

各位看官们,大家好,上一回中咱们说的是Android中Volley的例子,这一回中咱们说的例子是Android中的OkHttp。闲话休提,言归正转。让我们一起Talk Android吧!

看官们,我们在本章回中介绍另外一种HTTP库:OkHttp。它由三方公司提供,不过由于它出色的优势也得到了Android官方的认可。下面是它的优点:

  • 支持HTTP2
  • 拥有队列线程池对并发处理比较好
  • 使用缓存策略,对请求和响应处理比较好

使用步骤

接下来我们介绍如何在程序中使用okhttp库:

  • 1.导入库,可以使用窗口方式导入,或者直接在build.gradle中填写依赖;
  • 2.创建OkHttpClient对象,可以使用默认的配置,也可以自定义Client参数;
  • 3.创建Request对象,通过build创建(程序中有多种创建方法),可以设置请求类型(GET/POST等)
  • 4.使用OkHttpClient对象和Request对象创建call对象;
  • 5.使用call对象的execute()方法开始同步请求,需要处理异常,而且还需要单独启动线程,不能在主线程中发起同步请求;
  • 6.在execute()方法的返回结果中获取服务器对请求的响应结果;
  • //发起异步请求的步骤与发起同步请求的步骤只有这一步不同,其它步骤完全一致
  • 6.使用call的enqueue()方法开始异步请求,需要重写回调方法,在回调方法中获取服务器对请求的响应结果;
  • 7.取消call;

示例代码

光说不练不是我们的风格,下面是程序的示例代码,请大家参考:

   private void initOkHttpRequest() {
        mOkHttpClient = new OkHttpClient();
        //自定义Client参数
//        mOkHttpClient = new OkHttpClient.Builder()
//                .readTimeout(1*3000, TimeUnit.MILLISECONDS)
//                .writeTimeout(1*5000,TimeUnit.MILLISECONDS)
//                .build();
        //使用method方法创建Request
        mRequest = new okhttp3.Request.Builder()
                .method("GET",null)
                .build();

        //使用get方法创建Request
        mRequest = new okhttp3.Request.Builder()
                .get()
                .url(HTTP_URL)
                .build();
        //使用post方法创建Request,内容在requestbody中
        mRequest = new okhttp3.Request.Builder()
                .post(new RequestBody() {
                    @Override
                    public MediaType contentType() {
                        return null;
                    }

                    @Override
                    public void writeTo(BufferedSink sink) throws IOException {

                    }
                })
                .url(HTTP_URL)
                .build();
        mCall = mOkHttpClient.newCall(mRequest);
    }

    private void sendSyncOkHttpRequest() {
        if(mCall != null) {
               new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            okhttp3.Response response = mCall.execute();
                            Log.d(TAG, "sendOkHttpRequest: result is: "+response.body().string());
                        }catch (Exception e) {
                            Log.d(TAG, "sendOkHttpRequest: Exception:"+e);
                        }
                    }
                }).start();
        }
    }

    private void sendAsyncOkHttpRequest() {
        if(mCall != null) {
            mCall.enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    Log.d(TAG, "onFailure:  "+e.toString());
                }

                @Override
                public void onResponse(Call call, okhttp3.Response response) throws IOException {
                    if(response.cacheResponse() != null) {
                        Log.d(TAG, "onResponse:  result(catch) is: "+response.cacheResponse().toString());
                    }else {
                        Log.d(TAG, "onResponse:  result is: "+response.networkResponse().toString());
                    }
                }
            });
       }
    }

    if(mCall != null) {
        mCall.cancel();
    }

上面的程序只有主要功能的代码,其它代码省略了,此外,页面布局中只有一个Button,与布局相关的代码大家可以自已补充,我们在这里就不列出了。建议大家自己动手运行程序,通过程序的运行结果查看网站对HTTP请求的响应。关于上面的代码还有以下注意事项:

  • 1.在manifest文件中添加网络权限,不然会在运行程序会发生异常;
  • 2.在Java项目中okhttp的版本需要4.0以下才可以,4.0以上版本使用kotlin语言;
  • 3.创建OkHttpClient对象时可以使用默认的设置,也可以自定义超时等参数;
  • 4.Request对象有多种创建方法,可以依据需要自行选择,主要是把请求类型选择好就可以;
  • 5.发起同步请求时需要创建子线程,发起异步请求则不需要;

看官们,关于Android中OkHttp的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

talk_8

真诚赞赏,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值