天天看點

Rxjava2 Retrofit2 和 mvp再封裝

這個架構還是挺好用的,不過我技術比較渣,隻能封裝成這樣了,望大牛指點。

1.添加類庫

compile 'com.squareup.retrofit2:retrofit:2.3.0'
    compile 'com.squareup.retrofit2:converter-gson:2.3.0'
    compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
    compile 'io.reactivex.rxjava2:rxjava:2.0.1'
    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
    compile 'com.squareup.okhttp3:logging-interceptor:3.6.0'
           

2. RetrofitHelper類簡單封裝

package com.zlc.rxmvp.http;
    import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
    import com.ssdk.dongkang.App;
    import com.ssdk.dongkang.utils.LogUtil;

    import java.io.File;
    import java.io.IOException;
    import java.util.concurrent.TimeUnit;

    import okhttp3.Cache;
    import okhttp3.Interceptor;
    import okhttp3.OkHttpClient;
    import okhttp3.Request;
    import okhttp3.Response;
    import okhttp3.logging.HttpLoggingInterceptor;
    import retrofit2.Retrofit;
    import retrofit2.converter.gson.GsonConverterFactory;
    /**
     * Created by zlc
     * Retrofit幫助類
     */
    public class RetrofitHelper {

        //設定緩存目錄
        private static File cacheFile;
        private static long maxSize =  *  * ; //緩存檔案大小
        private final  static  long TIMEOUT = ;  //逾時時間
        private Cache mCache;
        private final static String baseUrl = HttpUrl.DOMAIN;
        private OkHttpClient mClient;
        private Retrofit mRetrofit;
        private final HttpService mHttpService;
        private static String TAG;

        private RetrofitHelper(){
            cacheFile = new File(App.getContext().getCacheDir().getAbsolutePath(), "dk_cache");
            if(!cacheFile.exists()){
                cacheFile.mkdir();
            }
            TAG = this.getClass().getSimpleName();
            mHttpService = getRetrofit().create(HttpService.class);
        }

        //單例 保證對象唯一
        public static RetrofitHelper getInstance(){
            return SingletonHolder.retrofitHelper;
        }

        private static class SingletonHolder{
            private final static RetrofitHelper retrofitHelper =  new RetrofitHelper();
        }

        //建立緩存檔案和目錄
        private Cache getCache(){
            if(mCache ==null)
                mCache = new Cache(cacheFile, maxSize);
            return mCache;
        }

        //擷取OkHttpClient
        private OkHttpClient getOkHttpClient(){
            if(mClient ==null) {
                mClient = new OkHttpClient.Builder()
                        .connectTimeout(TIMEOUT, TimeUnit.SECONDS)
                        .readTimeout(TIMEOUT, TimeUnit.SECONDS)
                        .writeTimeout(TIMEOUT, TimeUnit.SECONDS)
                        //.addInterceptor(headInterceptor)
                        .addInterceptor(loggingInterceptor)
                        .cache(getCache())      //設定緩存
                        .build();
            }
            return mClient;
        }

        //擷取Retrofit對象
        public Retrofit getRetrofit(){

            if(mRetrofit==null) {
                mRetrofit = new Retrofit.Builder()
                        .baseUrl(baseUrl)
                        .addConverterFactory(GsonConverterFactory.create())        //添加Gson支援
                        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())  //添加RxJava支援
                        .client(getOkHttpClient())                                 //關聯okhttp
                        .build();
            }
            return mRetrofit;
        }

        //擷取服務對象
        public static synchronized HttpService getService(){
            return RetrofitHelper.getInstance().mHttpService;
        }

        //日志攔截器
        private final static Interceptor headInterceptor = new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request mRequest=chain.request();
                //在這裡你可以做一些想做的事,比如token失效時,重新擷取token
                //或者添加header等等
                return chain.proceed(mRequest);
            }
        };

        //日志攔截器
        private final static HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
            @Override
            public void log(String message) {
                LogUtil.e(TAG + " : log",message);
            }
        }).setLevel(HttpLoggingInterceptor.Level.BODY);
    }
           

3. HttpService類簡寫

public interface HttpService{
        @FormUrlEncoded
        @POST("checkhardWare.htm")
        Observable<BaseInfo<LastTimeInfo>> checkHardWare(@FieldMap Map<String,String> map);
   }
           

4. HttpUtils類簡單封裝

package com.zlc.rxmvp.http;
    import android.text.TextUtils;
    import android.util.Log;
    import android.widget.Toast;

    import com.ssdk.dongkang.App;
    import com.ssdk.dongkang.utils.LogUtil;

    import io.reactivex.Observable;
    import io.reactivex.Observer;
    import io.reactivex.android.schedulers.AndroidSchedulers;
    import io.reactivex.disposables.Disposable;
    import io.reactivex.schedulers.Schedulers;
    /**
     * Created by zlc 
     * 網絡請求工具類
     */
    public class HttpUtil {

        //Post方式請求網絡
        public static void post(Observable observable, final OnResultListener resultListener){

            setSubscriber(observable, new Observer() {
                Disposable d;
                @Override
                public void onSubscribe(Disposable d) {
                    LogUtil.e("onSubscribe",d+"");
                    this.d = d;
                }

                @Override
                public void onNext(Object value) {
                    LogUtil.e("onNext",value+"");
                    if(value == null){
                        LogUtil.e("onNext ","JSON解析失敗");
                    }else if(resultListener!=null){
                        resultListener.onSuccess(value);
                    }
                }

                @Override
                public void onError(Throwable error) {
                    errorDispose(error, resultListener);
                    if(d != null)
                        d.dispose();
                }

                @Override
                public void onComplete() {
                    LogUtil.e("onComplete","請求完成");
                    if(d != null)
                        d.dispose();
                }
            });
        }

        //Get方式請求網絡
        public static void get(Observable observable, final OnResultListener resultListener){
            post(observable,resultListener);
        }

        //訂閱事件
        public static<T> void setSubscriber(Observable<T> observable, Observer<T> observer){
            observable.subscribeOn(Schedulers.newThread())  //開啟新線程
                    .observeOn(AndroidSchedulers.mainThread()) //ui操作放主線程
                    .subscribe(observer);
        }

        //接口回調
        public interface OnResultListener<T>{
            void onSuccess(T t);
            void onError(Throwable error, String msg);
        }

        //錯誤處理
        private static void errorDispose(Throwable error, OnResultListener resultListener) {
            if(error!=null && resultListener!=null){
                resultListener.onError(error,error.getMessage());
            }else if(resultListener!=null){
                resultListener.onError(new Exception("網絡不給力"),"");
                Toast.makeText(App.getContext(),"網絡不給力",Toast.LENGTH_LONG).show();
                return;
            }

            String e  = error.getMessage();
            int code  =;
            if(!TextUtils.isEmpty(e)){
                try {
                    e = e.substring(e.length()-,e.length());
                    code = Integer.valueOf(e);
                }catch (Exception e1){
                    Toast.makeText(App.getContext(),"網絡不給力",Toast.LENGTH_LONG).show();
                }
            }
            Log.e("錯誤code",code+"");
            if(code>=&&code<){
                Toast.makeText(App.getContext(),"您的請求迷路了,請稍後再試",Toast.LENGTH_LONG).show();
            }else if(code>=){
                Toast.makeText(App.getContext(),"伺服器異常,請稍後再試",Toast.LENGTH_LONG).show();
            }else{
                Toast.makeText(App.getContext(),"網絡不給力",Toast.LENGTH_LONG).show();
            }
        }
    }
           

5. mvp presenter封裝

package com.zlc.rxmvp.mvp;
    /**
     * Created by zlc on 
     */
    public interface BaseIPresenter{
        //銷毀View
        void onDestoryView();
    }

    package com.ssdk.dongkang.mvp;
    import android.content.Context;
    import com.ssdk.dongkang.http.HttpService;
    import com.ssdk.dongkang.http.RetrofitHelper;
    /**
     * Created by zlc on 
     * 所有Presenter層的父類
     */
    public  abstract class BasePresenter <T extends BaseIView> implements BaseIPresenter{

        protected  T mView;
        protected Context mContext;
        protected final HttpService mHttpService;
        public BasePresenter(T view,Context context){
            this.mView = view;
            this.mContext = context;
            mHttpService = RetrofitHelper.getService();
        }

        //請求網絡 加載資料方法
        protected  abstract void initData();

        //擷取HttpService對象
        public HttpService getService() {
            return mHttpService;
        }

        @Override
        public void onDestoryView() {
            if(mView !=null)
                mView = null;
        }
    }
           

6. mvp view封裝

package com.zlc.rxmvp.mvp;
    /**
     * Created by zlc on 
     * 所有View層的父類 隻是為了一個通用
     */
    public interface BaseIView {
        //資料請求失敗 View層處理
        void onError();
    }
           

7.聯系方式

qq:@qq.com 
email : [email protected] 
phone : 
           

8.下載下傳位址

點選去下載下傳