安卓在网络请求上的应用(一)

213 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情,希望大家多多支持,帮忙点个赞,谢谢!

前言

已经在工作接了不少次服务器请求接口,之前都是跟着模仿前人的代码,很少去总结,正好,现在把这一知识融汇贯通一下,也算一收获。 本篇文章围绕网络请求展开,来聊聊安卓中如何去实现这任务的,当然,我事先也在众多大神博客中了解到网络请求有很多方法,不止我这一种,如有错误,烦请指正。

正篇

通过对代码的阅读,工作中我用的应该是Retrofit2请求方法,如下: 首先先定义一个接口文件, get请求样式:

public interface Api {
    //get请求
    @GET("user")  //请求方法注解,get请求,括号内的是请求地址,Url的一部分
    Call<ResponseBody> getData();//Call<*>返回类型,*表示接收数据的类,一般自定义 接口方法名称,括号内可以写入参数
}

post请求实例:

@POST("XXXX")
@Headers({"Content-Type: application/x-www-form-urlencoded;charset=utf-8","CONNECT_TIMEOUT:20000", "READ_TIMEOUT:20000", "WRITE_TIMEOUT:20000"}) //定义头部
Call<ResponseBody> getXXXXXXX(
        @Body RequestBody requestBody
);

我写的是用单例实现的:

//单例
private Retrofit2Manager() {
    retrofitMap = new ConcurrentHashMap<>();
    client = new OkHttpClient.Builder().
            connectTimeout(30, TimeUnit.SECONDS).
            readTimeout(30, TimeUnit.SECONDS).
            writeTimeout(30, TimeUnit.SECONDS).
            connectionPool(new ConnectionPool(5,30,TimeUnit.SECONDS)).build();
}
public <T> T getApi(Class<T> clz, String url) {

    if (retrofitMap.get(url) == null) {
        synchronized (retrofitMap) {
            if (retrofitMap.get(url) == null) {
                Retrofit retrofit = new Retrofit.Builder()
                        .addConverterFactory(GsonConverterFactory.create())
                        .baseUrl(url)
                        .client(client)
                        .build();
                retrofitMap.put(url, retrofit);
            }
        }

把我们需要的请求的url以及对应的结构体类传进去,然后再用:

Call<ResponseBody> call

去创建Call对象用于callback监听回调获取返回体从而拿到我们想要的返回值。

call.enqueue(new Callback<ResponseBody>() {

            @Override

            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {

                if(response.code()== HttpURLConnection.HTTP_OK){

                    if (response.body() == null) {

                        return;

                    }

                    String jsonStr= null;

                    try {

                        jsonStr = response.body().string();

                    } catch (IOException e) {

                        e.printStackTrace();

                    }
                   ...
                }
                @Override
                public void onFailure(@NonNull Call<ResponseBody> call, @NonNull Throwable t) {...}
             });

这样看起来应用还是蛮简单的,下一节我们将具体探讨retrofit的使用,本节为应用示例。

小结

在写文章的时候顿了很多次,因为我对这块研究还不是很深,代码不是特别熟练,所以后续还会深入探讨,展开去说说,顺便拓展其他请求方法。