初识Android | 青训营笔记

92 阅读3分钟

初识Android | 青训营笔记

这是我参与「第四届青训营」笔记创作活动的的第6天

网络通信

网络请求

  • 客户端向服务端发起请求,服务端返回数据给到客户端

  • 由于网络请求在大型App里使用非常频繁,为了更好的支持业务迭代,一般会进行网络请求的封装

主流框架

image.png

  • Volley:它是把所有请求都保存在一个请求队列中,然后在请求队列中按优先级一个一个取出请求,然后发送出去。
public class MainActivity extends Activity {
    private static RequestQueue requestQueue;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //1、创建请求队列
        RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
         /**2、实例化StringRequest请求
          *  第一个参数选择Request.Method.GET即get请求方式
          *  第二个参数的url地址根据文档所给
          *  第三个参数Response.Listener 请求成功的回调
          *  第四个参数Response.ErrorListener 请求失败的回调
          */
        StringRequest stringRequest = new StringRequest(Request.Method.GET,"https://www。bytedance.com/", 
            new Response.Listener<String>() {
            @Override
            public void onResponse(String s) {
                //String s即为服务器返回的数据
                Log.d("cylog", s);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Log.e("cylog", volleyError.getMessage(),volleyError);
            }
        });
        //3、将请求添加进请求队列
        requestQueue.add(stringRequest);
    }
}
  • Retrofit:它是使用接口+注解的形式来定义一个网络请求,再通过OkHttp来执行网络请求;简而言之就是对OkHttp的一个封装。
    • 注解类型:(和lombok注解类似) 20210315143656471.png

    • 请求流程:

      • 定义接口,Retrofit要求定义一个网络请求的接口,接口函数里要定义url路径、请求参数、返回类型,并回去到Call实例。

      • 创建Retrofit对象、接口实例对象、网络工作对象

      • 调用call.enqueue进行异步请求

      • 处理返回数据

1. 创建接口
public interface GetRequest_Interface {
    @GET("user/{uid}/name")
    Call<Reception> getCall(@Field("name") String name);
    // @GET注解的作用:采用Get方法发送网络请求
    // getCall() = 接收网络请求数据的方法
    // 其中返回类型为Call<*>,*是接收数据的类(即上面定义的Translation类)
    // 如果想直接获得Responsebody中的内容,可以定义网络请求返回值为Call<ResponseBody>
}

2. 创建Retrofit实例
  Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("www.bytedance.com/") //设置网络请求的Url地址
                .addConverterFactory(GsonConverterFactory.create()) //设置数据解析器
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
             
3. 发送请求
        // 创建 网络请求接口 的实例
        GetRequest_Interface request = retrofit.create(GetRequest_Interface.class);
        //对 发送请求 进行封装
        Call<Reception> call = request.getCall("");
        call.enqueue(new Callback<Reception>() {
            //请求成功时回调
            @Override
            public void onResponse(Call<Reception> call, Response<Reception> response) {
                //请求处理,输出结果
                response.body().show();
            }
            //请求失败时候的回调
            @Override
            public void onFailure(Call<Reception> call, Throwable throwable) {
                System.out.println("连接失败");
            }
        });

          //同步请求
        try {
            Response<Reception> response = call.execute();
            response.body().show();
        } catch (IOException e) {
            e.printStackTrace();
        }

  • OkHttp:它支持get请求和post请求,支持基于Http的文件上传下载,支持加载图片,支持响应缓存避免重复的网络请求,支持使用连接池来降低响应延迟时间。
    • 请求流程
    • Step1:创建oKHttpClient对象,也就是构建一个网络类型的实例,一般会将所有的网络请求使用同一个单例对象。
    • Step2:构建Request,也就是构建一个具体的网络请求对象,具体的请求url,请求头,请求体等等。
    • Step3:构建请求Call,也就是将具体的网络请求与执行请求的实体进行绑定,形成一个具体的正式的可执行实体。
    • Step4:后面就进行网络请求了,然后处理网络请求的数据了 20210315143656471.png
1.异步:
 	OkHttpClient okHttpClient = new OkHttpClient();
        Request request = new Request.Builder()
                .url(url)
                //默认get请求
                .get()
                .build();

        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) { }
            
            @Override
            public void onResponse(Call call, Response response) throws IOException {}
        });

2.同步:
 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                .detectDiskReads()
                .detectDiskWrites()
                .detectNetwork()
                .penaltyLog()
                .penaltyDialog()
                .build());

        OkHttpClient okHttpClient = new OkHttpClient();

        Request request = new Request.Builder()
                .url(url)
                .build();
        try {
           Response response =  okHttpClient.newCall(request).execute();
        } catch (IOException e) {
            e.printStackTrace();
        }