1、添加依赖库
添加retrofit、okhttp、rxjava、rxandroid、gson依赖库。
implementation'com.squareup.retrofit2:retrofit:2.0.0'
implementation'com.squareup.retrofit2:converter-gson:2.0.0'
api'com.google.code.gson:gson:2.6.1'
api'com.squareup.okhttp3:okhttp:3.2.0'
api'com.squareup.retrofit2:adapter-rxjava:2.0.0'
implementation'io.reactivex:rxjava:1.1.0'
implementation'io.reactivex:rxandroid:1.1.0'
api'com.squareup.okhttp3:logging-interceptor:3.2.0'
2、创建用于描述网络请求的接口
用动态代理动态的将该接口的注解翻译成一个http请求,最好在执行http请求。
接口中每个方法的参数都有使用注解标注,否则会报错。
public interface ApiService {
@POST("login.html")
Call<JsonObject> login(@Body LoginParam param);
}
注解类型
网络请求的方法:@POST @GET @PUT @DELETE @PATH @HEAD @OPTIONS @HTTP
标记类:@FormUrlEncoded @Multipart @Streaming
网络请求参数:@Header @headers @URL @Body @Path @Field @FieldMap
@Part @PartMap @Query @QueryMap
网络请求的完整Url = 创建Retrofit实例时通过baseUrl()设置+网络请求接口的注解设置(@POST括号后面)。
@FormUrlEncoded 表示发送form-encoded的数据,每个键值对需要用Field来注解键名,随后的对象需要提供值。
@Multipart 表示发送form-encoded的数据(适用于文件上传的场景),每个键值对用@Part来注解键名,随后的对象需要提供值。
RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), filePath);
MultipartBody.Part part = MultipartBody.Part.createFormData("imgFile", filePath.getName(), requestFile);
@POST("login.html")
@Multipart
Call uploadFile(@Part MultipartBody.Part part);
3、创建Retrofit实例
Retrofit retrofit =new Retrofit.Builder() ;
retrofit.baseUrl("https://www.sojson.com/open/api/weather/") ;
retrofit.addConverterFactory(GsonConverterFactory.create()) ;
retrofit.addCallAdapterFactory(RxJavaCallAdapterFactory.create());
//设置请求Https或Http
retrofit.client(USE_HTTPS ? generateHttpsClient(context) : getHttpClient());
/*** 使用http方式请求网络 */
@NonNull
private OkHttpClientgetHttpClient() {
okHttpClient.connectTimeout(10 , TimeUnit.SECONDS);
return okHttpClient.build();
}
/**https*/ 请求
private OkHttpClientgenerateHttpsClient(Context context) {
try {
SSLSocketFactory socketFactory =new NoSSLv3SocketFactory(getSSLConfig(context, R.raw.smartcampus).getSocketFactory());
okHttpClient.sslSocketFactory(socketFactory);
}catch (IOException e) {
e.printStackTrace();
}catch (CertificateException e) {
e.printStackTrace();
}catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}catch (KeyStoreException e) {
e.printStackTrace();
}catch (KeyManagementException e) {
e.printStackTrace();
}
return okHttpClient.build();
}
4、创建请求接口实例
ApiService apiService = retrofit.build().create(ApiService.class);
5、发送网络请求
apiService.login(param).enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
if (response.isSuccessful()) {
LogUtil.e("member", "body==" + response.body().toString());
int code = response.body().get(ConfigUtil.CODE).getAsInt();
String message = response.body().get(ConfigUtil.MSG).getAsString();
if (code ==200) {
JsonObject jsonObject = response.body().getAsJsonObject(ConfigUtil.BODY);
}else {
ToastUtils.showToast(LoginActivity.this, message);
}
}
dialog.dismiss();
}
@Override
public void onFailure(Call call, Throwable t) {
dialog.dismiss();
}
});
RxJava
RxJava是基于事件流,实现异步操作的库。
作用:实现异步操作
特点:逻辑简洁、实现优雅(基于事件流的链式调用)、使用简单
原理:基于一种扩展的观察者模式
被观察者(Observable)通过订阅(Subscribe)按顺序发送事件(Event)给观察者(Observer),观察者按顺序接收事件并对应的相应动作。