仿“ONE”项目运用

作者: 泅渡者 | 来源:发表于2017-03-29 11: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下来好好研究下 。

    相关文章

      网友评论

        本文标题:仿“ONE”项目运用

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