okhttp3几种用法解析

HTTP是现代应用程序网络的方式,有效地使用HTTP可以使加载更快。OkHttp是一个默认有效的HTTP客户机:HTTP/2支持允许向同一主机的所有请求共享一个套接字。连接池减少了请求延迟。响应缓存完全避免了网络的重复请求。如果您的服务有多个IP地址,那么当第一个连接失败时,OkHttp将尝试替换地址。这对于IPv4+IPv6和驻留在冗余数据中心的服务是必需的。OkHttp启动与现代TLS特性(SNI, ALPN)的新连接,如果握手失败,则返回到TLS 1.0。使用OkHttp很容易。它的请求/响应API是用流畅的构建器和不变性来设计的。它支持同步阻塞调用和带回调的异步调用。OkHttp支持Android 2.3和以上。对于Java,最低要求是1.7。此段文字来自:点击打开链接

使用前先添加依赖:

compile 'com.squareup.okhttp3:okhttp:3.8.0'
compile 'com.squareup.okio:okio:1.7.0'

根据业务需要添加的各种权限,例如SD卡权限、网络权限等等。

上代码:

public class OkhttpActivity extends AppCompatActivity {
    OkHttpClient okClient;
    //定义文件类型
    MediaType MEDIATYPE = MediaType.parse("xxxxx");
    例:json:application/json , xml application/xml  ,  png : image/png  ,  jpg : image/jpeg   ,  gif : imge/gif

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_okhttp);
        enqueueGet();
        enqueuePost();
        upLoadFile();
        upDownFile();
        upLoadMultipartFile();
        initOkhttp();
    }

    //Okhttp初始设置超时时间和缓存
    private void initOkhttp() {
        OkHttpClient.Builder build = new  OkHttpClient.Builder()
                .connectTimeout(10, TimeUnit.SECONDS)
                .writeTimeout(20,TimeUnit.SECONDS)
                .readTimeout(20,TimeUnit.SECONDS)
                .cache(new Cache(getExternalCacheDir().getAbsoluteFile(),10*1024*1024));
        OkHttpClient okHttpClient = build.build();

    }

    //异步get
    private void enqueueGet() {
        okClient = new OkHttpClient();
        Request.Builder requestB = new Request.Builder().url("http://www.baidu.com");
        requestB.method("GET",null);
        Request request = requestB.build();
        Call call = okClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                //请求失败
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                //请求成功
                //判断得到的数据是否是缓存数据
                if (null !=response.cacheResponse()){
                    //是缓存数据
                }else {
                    //不是缓存数据
                    String str = response.networkResponse().toString();
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            //执行各种UI操作
                        }
                    });
                }
            }
        });
        //取消请求
        call.cancel();
    }
    //异步post
    private void enqueuePost() {
        okClient = new OkHttpClient();
        RequestBody requestB = new FormBody.Builder()
                .add("xx","xxx")//参数
                .build();
        Request request = new Request.Builder()
                .url("XXX")//请求路径
                .post(requestB)
                .build();
        Call call = okClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                //请求失败
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
            //请求成功
                //判断得到的数据是否是缓存数据
                if (null !=response.cacheResponse()){
                    //是缓存数据
                }else {
                    //不是缓存数据
                    String str = response.networkResponse().toString();
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            //执行各种UI操作
                        }
                    });
                }
            }
        });
        //取消请求
        call.cancel();
    }
    //异步上传文件  注:同步可以用execute
    private void upLoadFile() {
        okClient = new OkHttpClient();
        File file = new File("XXX");//文件路径 获取文件
        Request request = new Request.Builder()
                .url("xxxxxxx")//上传文案件的服务器
                .post(RequestBody.create(MEDIATYPE,file))
                .build();
        Call call = okClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                //失败
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
            //成功
            }
        });
        //取消请求
        call.cancel();
    }
    //异步下载文件
    private void upDownFile() {
        okClient = new OkHttpClient();
        Request request = new Request.Builder()
                .url("xxxxxxx")//下载文件的路径
                .build();
        Call call = okClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                //失败
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
            //成功
                try {
                    InputStream inputStream = response.body().byteStream();
                    FileOutputStream fileOutputStream = null;
                    fileOutputStream = new FileOutputStream(new File("xxxx"));//下载到
                    byte[] buff = new byte[2048];
                    int len = 0;
                    while ((len = inputStream.read(buff)) != -1){
                        fileOutputStream.write(buff,0,len);
                    }
                    fileOutputStream.flush();;
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        });
        //取消请求
        call.cancel();
    }
        //同时上传文件和参数时
    private void upLoadMultipartFile() {
        okClient = new OkHttpClient();
        RequestBody requestB = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart("XX","XX")
                .addFormDataPart("XXX","XXX",RequestBody.create(MEDIATYPE,new File("XXX")))
                .build();
        Request request = new Request.Builder()
                .url("XXXX")
                .post(requestB)
                .build();
        Call call = okClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                //失败
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                //成功
            }
        });
        //取消请求
     call.cancel();
    }

    @Override
    protected void onDestroy() {

        super.onDestroy();
    }
}

在此例子中各种的路径、参数都是虚拟数据。

OkHttp的封装

版权声明:本文为博主原创文章,如需转载必须注明转载地址。https://blog.csdn.net/yedekuqi4712/article/details/80224825

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值