Rx系列码农进阶之旅Android开发

仿“ONE”项目运用

2017-03-29  本文已影响97人  泅渡者

简介

在看这篇文章时最好先去我之前写的有关DataBinding、RxJava、Retorfit2.0的介绍,本项目数据来源是https://github.com/jokermonn/-Api/blob/master/ONEv3.5.0~.md
若该API存在侵权行为,希望及时通知,本人会立刻关闭该项目以及所有有关文章,谢谢。
本项目的地址:ONE
https://github.com/VampireCarrot/One.git
项目截图:

图片.png 图片.png 图片.png
项目架构

我们先看一眼项目的整体结构


图片.png

接下来我会带大家了解下我在项目中是怎么运用Retorfit +MVP的:

HTTP 封装
图片.png

API:

public class Api {
    /**
     * 服务器地址
     */
    private static final String BASE_URL = "http://v3.wufazhuce.com:8000/api/";
    // 消息头
    private static final String HEADER_X_HB_Client_Type = "X-HB-Client-Type";
    private static final String FROM_ANDROID = "ayb-android";
    private static ApiService service;
    private static Retrofit retrofit;
    private static OkHttpClient okHttpClient;
    public static ApiService getService() {
        if (service == null) {
            service = getRetrofit().create(ApiService.class);
        }
        return service;
    }
    private static Retrofit getRetrofit() {
        if (retrofit == null) {
            retrofit = new Retrofit.Builder()
                    .client(getOkHttpClient())
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                    .build();
        }
        return retrofit;
    }
    public static OkHttpClient getOkHttpClient(){
        if (okHttpClient==null){
            okHttpClient = new OkHttpClient.Builder()
                    .connectTimeout(15, TimeUnit.SECONDS)
                    .addInterceptor(getLogingInstance())
                    .cache(getCacheInstance())
                    .build();
        }
        return okHttpClient;
    }
    public static HttpLoggingInterceptor getLogingInstance(){
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
            @Override
            public void log(String message) {
                LogUtil.g("HttpLog", message);
            }
        });
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        return interceptor;
    }
    public static Cache getCacheInstance(){
        //设置 请求的缓存
        File cacheFile = new File(MyApplication.getInstance().getCacheDir(), "cache");
        Cache cache = new Cache(cacheFile, 1024 * 1024 * 50); //50Mb
        return cache;
    }
    /**
     * 对 Observable<T> 做统一的处理,处理了线程调度、分割返回结果等操作组合了起来
     * @param responseObservable
     * @param <T>
     * @return
     */
    protected <T > Observable<T> applySchedulers(Observable<T> responseObservable) {
        return responseObservable.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .flatMap(new Func1<T, Observable<T>>() {
                    @Override
                    public Observable<T> call(T tResponse) {
                        return flatResponse(tResponse);
                    }
                });
    }
    /**
     * 对网络接口返回的Response进行分割操作 对于json 解析错误以及返回的 响应实体为空的情况
     * @param response
     * @return
     */
    public < T > Observable<T> flatResponse(final T response) {
        return Observable.create(new Observable.OnSubscribe<T>() {
            @Override
            public void call(Subscriber<? super T> subscriber) {
                if (response != null) {
                    if (!subscriber.isUnsubscribed()) {
                        subscriber.onNext(response);
                    }
                } else {
                    if (!subscriber.isUnsubscribed()) {
                        subscriber.onError(new APIException("自定义异常类型", "解析json错误或者服务器返回空的json"));
                    }
                    return;
                }
                if (!subscriber.isUnsubscribed()) {
                    subscriber.onCompleted();
                }
            }
        });
    }

    /**
     * 自定义异常
     */
    public static class APIException extends Exception {
        public String code;
        public String message;

        public APIException(String code, String message) {
            this.code = code;
            this.message = message;
        }

        @Override
        public String getMessage() {
            return message;
        }

    }
}

在Api中我们将 OkHttpClient、HttpLoggingInterceptor 、Retrofit 等进行初始化操作。都采用单例模式,方便调用以及销毁。
至于applySchedulers其实就是RXJava的内容了,这里主要是统一处理线程调度,让消息发送者处在Schedulers.io()也就是异步线程,让消息接收者处在AndroidSchedulers.mainThread()也就是主线程。这样我们使用Retorfit请求得来的数据便可以在主线程做处理。

ApiService:

定义API

public interface ApiService {

    @GET("onelist/idlist")
    Observable<IdBean> doIdList(@Query("channel") String channel, @Query("version") String version, @Query("uuid") String uuid, @Query("platform") String platform);

    @GET("onelist/{idList}/0?channel=wdj&version=4.0.2&uuid=ffffffff-a90e-706a-63f7-ccf973aae5ee&platform=android")
    Observable<OneListBean> doOneList(@Path("idList") String idList);

    @GET("essay/{item_id}/?channel=wdj&source=summary&source_id=9261&version=4.0.2&uuid=ffffffff-a90e-706a-63f7-ccf973aae5ee&platform=android")
    Observable<OneReadInfo> doOneReadInfo(@Path("item_id") String item_id);
}

图片.png

这张图完全阐述了该项目中retorfit +rxJava 间是怎么使用的。(绘图比较潦草请见谅)
在在项目中我只完成了首页页面,以及部分子页面的展示功能。其他功能还有待完善。大家可以clone下来好好研究下 。

上一篇下一篇

猜你喜欢

热点阅读