前言
现在Android 市面上很火的当然是 Retrofit+RxJava + OkHttp, 功能强大,简单易用,因此选用这套方案来改造网络库。Retrofit: Retrofit是Square 公司开发的一款正对Android 网络请求的框架。底层基于OkHttp 实现,OkHttp 已经得到了google 官方的认可。Retrofit官网
OkHttp: 也是Square 开源的网络请求库
RxJava:RxJava 在 GitHub 主页上的自我介绍是 “a library for composing asynchronous and event-based programs using observable sequences for the Java VM”(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库)。这就是 RxJava ,概括得非常精准。总之就是让异步操作变得非常简单。
各负其责:
Retrofit 负责请求的数据和请求的结果,使用接口的方式呈 现,OkHttp 负责请求的过程,RxJava 负责异步,各种线程之间的切换。
RxJava + Retrofit + okHttp 已成为当前Android 网络请求最流行的方式。
下面封装 一个 Retrofit + RxJava + OkHttp 的工具类 。
实现
第一步:在app下的builder.gradle中添加依赖库
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
implementation 'com.squareup.okhttp3:okhttp:3.9.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.9.0'
implementation 'io.reactivex:rxjava:1.3.0'
implementation 'io.reactivex:rxandroid:1.2.1'
implementation 'com.squareup.retrofit2:adapter-rxjava:2.3.0'
第二步:写接口,新建一个Interface 开始写接口
模拟一个登陆接口
public interface ApiInterface {
@FormUrlEncoded
@POST("api/login")
Observable<Login> login(@Field("username") String username, @Field("password") String password);
}
重点来了: 开始封装网络请求框架
import android.util.Log;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
/**
* Created by 梁on
*/
public class HttpClient {
private static HttpClient httpClient = null ;
private final ApiInterface apiInterface; //接口对象
//同步锁,单例模式,保证多线程访问的安全
public static synchronized HttpClient getInstance(){
if(httpClient == null)
{
httpClient = new HttpClient() ;
}
return httpClient ;
}
/*
* 构造方法
* */
private HttpClient() {
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(8, TimeUnit.SECONDS) //连接超时时间
.readTimeout(8,TimeUnit.SECONDS) //读取超时时间
.writeTimeout(8,TimeUnit.SECONDS) //写超时时间
.addInterceptor(new Interceptor() { //过滤器
@Override
public Response intercept(Chain chain) throws IOException {
Request original = chain.request();
Request request = original.newBuilder()
.addHeader("token", "token") //添加token
.method(original.method(), original.body())
.build();
return chain.proceed(request);
}
})
.build();
Gson gson = new GsonBuilder().serializeNulls().setLenient().create(); //setLenient()严格按照日期的方式解析json
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("这里是你的url地址")
.addConverterFactory(GsonConverterFactory.create(gson)) //配置转化库 默认是 json
.client(okHttpClient)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
apiInterface = retrofit.create(ApiInterface.class);//创建接口的实例
}
private void toSubscribe(Observable o, Subscriber s) {
o.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(s);
}
/**
* 登陆
*
* @param subscriber
* @param username 用户名
* @param password 密码
*/
public void login(Subscriber<Login> subscriber ,String username, String paassword){
Observable<Login> observable = apiInterface.login(username,paassword);
observable.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
}
}
第三步:写实体类 Login,也就是要 写gson 解析json 的字段名,以下就不贴出来了
第四步 在activity中调用
HttpClient.getInstance().login(new Subscriber<Login>() {
//请求成功
@Override
public void onCompleted() {
Toast.makeText(MainActivity.this,"cehnggong",Toast.LENGTH_SHORT).show();
}
//请求失败
@Override
public void onError(final Throwable e) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,e.getLocalizedMessage(),Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onNext(Login login) {
//在此处理请求成功以后的逻辑 Toast.makeText(MainActivity.this,"onNext",Toast.LENGTH_SHORT).show();
}
},"用户名","123456");
工具可以直接贴出来 直接使用。