美文网首页安卓开发笔记
RxJava,RxAndroid,Retrofit使用

RxJava,RxAndroid,Retrofit使用

作者: TiaoPi | 来源:发表于2016-07-11 19:54 被阅读0次

参开文章: 主要是扔物线大神给安卓开发者的详解,还有很多很多的文章;然后我这边就只写我自己的代码,网上很多文章都很好完全能够明白.

项目准备使用RxJava,RxAndroid,Retrofit开发,然后就自己研究了几天,今天开始项目,就网络下载进行了分装,然后结合各路大神的文章,还有知乎的一些做了这个.

主要是

这个主要是就是对下载进行一个封装,然后就是可以根据json格式进行转换,主要是相同部分,开始的位置进行下载成功与否的判断,然后把data部分保留下来,用到了一个map的操作符.剩下的就是基本都一样,下载完事之后进行调用就OK了;

比如类似这种格式的

{
    "code": "2",
    "message": "OK",
    "data": "数据",
}

下面是项目的代码直接上

  • 添加依赖
    compile 'io.reactivex:rxandroid:1.2.1'
    compile 'io.reactivex:rxjava:1.1.6'
    compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.squareup.okhttp3:okhttp:3.4.1'
    compile 'com.squareup.retrofit2:adapter-rxjava:2.0.1'
    compile 'com.squareup.retrofit2:converter-gson:2.0.1'

添加依赖的时候好多人说的不是很一样,然后我自己的话就这样添加的,至于为啥,我也不知道,这个目前没有错, 也不知道是不是对的(当然我的下载是没有问题的)

  • 然后就是弄了三个类


  • ApiService.class
    这个类主要是,,,,看代码就行了,,, 请求前面不要加"/",添加会报404,这个要注意,也可加添加Headers,我实在代码设置Okhttp的时候添加的;

    @GET("test")
    Observable getTest(@Query("a") int a);

就是这样的一个get请求,后面的大家应该都知道

  • HttpRetrofit.class
    这个类主要就是进行一些初始化.然后就是设置一些东西,然后就是绑定订阅, 这边的话是把Observable和Subscriber设置了泛型T进行连接,这样的话早设置线程转换的时候就不用重复添加代码了.看代码

/**
 * Created by zhiguo on 2016/7/11.
 * 封装了一个RX系列网络下载的类    这边主要是做一些配置和初始化
 */
public class HttpRetrofit{

    private static OkHttpClient okHttpClient;

    public HttpRetrofit(){
        okHttpClient = new OkHttpClient();
        setOkHttpClient();
    }

    /**
     * 设置调用OkHttpClient
     */
    private void setOkHttpClient(){
        

        okHttpClient.newBuilder()
                .addInterceptor(loggingInterceptor)
                .retryOnConnectionFailure(true)
                .addInterceptor(new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request request = chain.request()
                        .newBuilder()
                        .build();
                return chain.proceed(request);
            }
        });
    }

    /**
     * 初始化retrofit
     * @return
     */
    public Retrofit getRetrofit(){

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://api.lafeng.com/")  //服务器地址
                .client(okHttpClient)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
        return retrofit;
    }

    /**
     * 封装调用   主要是设置订阅的线程转换
     * @param observable
     * @param subscriber
     * @param 
     */
    public  void httpSubscribe(Observable observable, Subscriber subscriber){
        observable
                .map(new Func1() {
                    @Override
                    public T call(T t) {
                        //在这里进行转化, 进行json外层部分的判断并返回

                        return t;
                    }
                })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .unsubscribeOn(Schedulers.io())
                .subscribe(subscriber);
    }

    /**
     * 关联接口类
     * @return
     */
    public  ApiService getApiService(){
        return getRetrofit().create(ApiService.class);
    }

}

我的注释不是很多,基本都能明白,不过还是有一些坑的

  • HttpPost.class
    最后就是这个类,这个类是要是为了方便调用和统一管理,看一下就明白了,方便管理,可能也不是很有用
/**
 * Created by zhiguo on 2016/7/11.
 * 这个类只要是设置下载返回的类      返回的结果在Subscriber
 */
public class HttpPost {

   private static HttpRetrofit httpRetrofit = new HttpRetrofit();

    public static void getTest(Subscriber subscriber){
        httpRetrofit.httpSubscribe(httpRetrofit.getApiService().getTest(0),subscriber);
    }


}

好了,代码就这些,然后就是TestBean.class,这个类随便搞;

调用是这样的

  HttpPost.getTest(new Subscriber() {

                    @Override
                    public void onNext(TestBean t) {

                        textView.setText(t.toString());
                    }

                    @Override
                    public void onCompleted() {
                    }

                    @Override
                    public void onError(Throwable e) {
                        e.printStackTrace();
                    }
                });

好,完事了,基本是可以的用的,其他的细节方面在弄弄;

相关文章

网友评论

    本文标题:RxJava,RxAndroid,Retrofit使用

    本文链接:https://www.haomeiwen.com/subject/qeejjttx.html