封装Retrofit + okhttp + rxjava网络请求框架

来源:互联网 发布:bootstrap input控件js 编辑:程序博客网 时间:2024/05/24 03:22

前言

现在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");

工具可以直接贴出来 直接使用。

阅读全文
0 0
原创粉丝点击