初识Android | 青训营笔记
这是我参与「第四届青训营」笔记创作活动的的第6天
网络通信
网络请求
-
客户端向服务端发起请求,服务端返回数据给到客户端
-
由于网络请求在大型App里使用非常频繁,为了更好的支持业务迭代,一般会进行网络请求的封装
主流框架
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注解类似) -
请求流程:-
定义接口,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:后面就进行网络请求了,然后处理网络请求的数据了
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();
}