美文网首页
MVP抽取.md

MVP抽取.md

作者: 魔女小姐的猫 | 来源:发表于2020-06-22 21:46 被阅读0次

    让子类的工作模式都按父类的执行 一个抽象类公开定义了执行它的方法的方式

    网络抽取

    HttpManager

    public class HttpManger {
        private static volatile HttpManger httpManger;
        private final Retrofit.Builder builder;
    
        public static HttpManger getHttpManger() {
            if (httpManger == null) {
                synchronized (HttpManger.class) {
                    if (httpManger == null) {
                        httpManger = new HttpManger();
                    }
                }
            }
            return httpManger;
        }
    
        public HttpManger() {
            builder = new Retrofit.Builder()
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .addConverterFactory(GsonConverterFactory.create())
                    .client(getOkHttpClient());
    
        }
    
        private OkHttpClient getOkHttpClient() {
            OkHttpClient.Builder okBuilder = new OkHttpClient.Builder()
                    .connectTimeout(10, TimeUnit.SECONDS)
                    .readTimeout(10, TimeUnit.SECONDS)
                    .writeTimeout(10, TimeUnit.SECONDS)
                    .retryOnConnectionFailure(true)
                    .cache(new Cache(new File(UserApplication.getUserApplication().getCacheDir(), Cotasts.CACHE_NAME), 1024 * 1024 * 10))
                    .addInterceptor(new CacheIntercetor())
                    .addNetworkInterceptor(new CacheIntercetor());
    
            if (Cotasts.IS_DEBUG == true) {
                okBuilder.addInterceptor(new LoggingInterceptor());
            }
    
            return okBuilder.build();
    
        }
    
        class LoggingInterceptor implements Interceptor {
    
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request request = chain.request();
                long startTime = System.nanoTime();
                //          请求前
                Log.d("TAG", String.format("Sending request %s on %s%n%s",
    
                        request.url(), chain.connection(), request.headers()));
    
                //          请求中
                Response response = chain.proceed(request);
    
                //           请求后
                long endTime = System.nanoTime();
                Log.d("TAG", String.format("Received response for %s in %.1fms%n%s",
                        response.request().url(), (endTime - startTime) / 1e6d, response.headers()));
                return response;
            }
        }
    
    
        class CacheIntercetor implements Interceptor {
    
            @Override
            public Response intercept(Chain chain) throws IOException {
                //请求前
                Request request = chain.request();
    
                //判断如果无网时,设置缓存协议
                if (!isNetWorkAvaiable(UserApplication.getUserApplication())) {
                    request = request.newBuilder().cacheControl(CacheControl.FORCE_CACHE).build();
                }
    
                //网络请求
                Response response = chain.proceed(request);
    
                //是否有网
                if (isNetWorkAvaiable(UserApplication.getUserApplication())) {
                    int maxAge = 0;
                    response = response.newBuilder().removeHeader("Pragma")
                            .addHeader("Cache-Control", "public ,max-age=" + maxAge)
                            .build();
                    return response;
                } else {
                    int maxStale = 60 * 60 * 24;
                    response = response.newBuilder().removeHeader("Pragma")
                            .addHeader("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
                            .build();
                    return response;
                }
            }
        }
    
        public boolean isNetWorkAvaiable(Context context) {
            ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo info = connectivityManager.getActiveNetworkInfo();
            if (info != null) {
                return info.isAvailable();
            }
            return false;
        }
    
        public <T> T getApiService(String baseUrl, Class<T> clazz) {
            return builder.baseUrl(baseUrl).build().create(clazz);
        }
    }
    
      
    

    RxUtil

    /**
     * 抽取线程切换
     */
    public class RxUtil {
        /**
         * <T, T> 转换前的对象类型 | 转换后的对象类型
         *
         * @param <T>
         * @return
         */
        public static <T> ObservableTransformer<T, T> rxObservableTransformer() {
            return new ObservableTransformer<T, T>() {
                @Override
                public ObservableSource<T> apply(Observable<T> upstream) {
                    return upstream
                            .subscribeOn(Schedulers.io())
                            .observeOn(AndroidSchedulers.mainThread());
                }
            };
        }
    
    //背压
        public static  <T>FlowableTransformer<T,T> onFlowableTransformer(){
            return new FlowableTransformer<T, T>() {
                @Override
                public Publisher<T> apply(Flowable<T> upstream) {
                    return upstream.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());
                }
            };
        }
    
    }
    
    

    baseFlowable基类

    package com.example.day7work.base;
    
    import android.util.Log;
    
    import io.reactivex.subscribers.ResourceSubscriber;
    
    public abstract class BaseFlowable<T>  extends ResourceSubscriber<T> {
        @Override
        public void onNext(T t) {
            onSucess(t);
        }
    
        protected abstract void onSucess(T t);
    
        @Override
        public void onError(Throwable t) {
            onFail(t.getMessage());
    
                       /** //对异常进行分类,不同的异常提示用户不同的信息
                            if (e instanceof HttpException) {
                                //   HTTP错误
                                callBack.onFail("HTTP错误");
                            } else if (e instanceof ConnectException
                                    || e instanceof UnknownHostException) {
                                //   连接错误
                                callBack.onFail("连接错误");
                            } else if (e instanceof InterruptedIOException) {
                                //  连接超时
                                callBack.onFail("连接超时");
                            } else if (e instanceof JsonParseException
                                    || e instanceof JSONException
                                    || e instanceof ParseException) {
                                //  解析错误
                                callBack.onFail("解析错误");
                            } else {
                                if (e != null) {
                                    callBack.onFail(e.toString());
                                } else {
                                    callBack.onFail("未知错误");
                                }
                            }*/
    
        }
    
        protected abstract void onFail(String message);
    
        @Override
        public void onComplete() {
            Log.i("tag", "完成");
        }
    }
    
    

    base基类

    观察者抽取

    /**
     * 封装观察者
     *
     * @param <T>
     */
    public abstract class BaseObserver<T> implements Observer<T> {
        private Disposable mDisposable;
        private BaseModel mModel;
    
        public BaseObserver(BaseModel mModel) {
            this.mModel = mModel;
        }
    
        @Override
        public void onSubscribe(Disposable d) {
            mDisposable = d;
            mModel.addModel(mDisposable);
            Log.e("TAG", "onSubscribe: " + "订阅成功");
        }
    
        @Override
        public void onNext(T t) {
            onSuccess(t);
            //断开订阅
            mDisposable.dispose();
            mModel.compositeDisposable.remove(mDisposable);
        }
    
        @Override
        public void onError(Throwable e) {
            onFail("onError: " + e.getMessage());
        }
    
        @Override
        public void onComplete() {
            Log.e("TAG", "onComplete");
        }
    
        public abstract void onSuccess(T t);
    
        public abstract void onFail(String error);
    
    }
    
    

    BaseActivity

    /**
     * 封装activity
     */
    public abstract class BaseActivity<P extends BasePresenter, V extends BaseView> extends AppCompatActivity {
        protected P mPresenter;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(getLayoutId());
            ButterKnife.bind(this);
            //抽取MVP
            mPresenter = initMvpPresenter();
            if (mPresenter != null) {
                mPresenter.setmView(initMvpView());
            }
    
            initView();
            initData();
            initListener();
        }
    
        protected abstract V initMvpView();
    
        protected abstract P initMvpPresenter();
    
        private void initListener() {
        }
    
        private void initData() {
        }
    
        private void initView() {
        }
    
        protected abstract int getLayoutId();
    
        public void toast(String toastMsg){
            Toast.makeText(this, toastMsg, Toast.LENGTH_SHORT).show();
        }
    }
    
    

    BaseFragment

    public abstract
    class BaseFragment<P extends BasePresenter, V extends BaseView> extends Fragment {
    
        protected P mPresenter;
        private View view;
        private Unbinder bind;
    
        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            view = inflater.inflate(getLayoutId(), container, false);
            bind = ButterKnife.bind(this, view);
    
            mPresenter = initMvpPresenter();
            if (mPresenter != null) {
                mPresenter.setmView(initMvpView());
            }
    
            initView();
            initData();
            initListener();
            return view;
        }
    
        protected abstract V initMvpView();
    
        protected abstract P initMvpPresenter();
    
        private void initListener() {
        }
    
        private void initData() {
        }
    
        private void initView() {
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            bind.unbind();
        }
    
        protected abstract int getLayoutId();
    }
    
    

    BaseCallback

    public interface BaseCallback<T> {
        void onSuccess(T t);
    
        void onFail(String error);
    }
    
    

    BaseView

    public interface BaseView<T> {
        void onSuccess(T t);
    
        void onFail(String error);
    }
    
    

    BaseModel

    public abstract class BaseModel {
        public CompositeDisposable compositeDisposable;
    
        public void onDestroy() {
            //切断所有的 disposable 对象
            if (compositeDisposable != null) {
                compositeDisposable.clear();
            }
        }
    
        public void addModel(Disposable disposable) {
            if (compositeDisposable == null) {
                compositeDisposable = new CompositeDisposable();
            }
            compositeDisposable.add(disposable);
        }
    }
    
    

    BasePresenter

    /**
     * 有界泛型 mView
     * 封装presenter
     *
     * @param <V>
     */
    public abstract class BasePresenter<V extends BaseView> {
        protected V mView;
        private ArrayList<BaseModel> models = new ArrayList<>();
    
        public void setmView(V mView) {
            this.mView = mView;
        }
    
        public BasePresenter() {
            initModel();
        }
    
        protected abstract void initModel();
    
        public void onDestroy() {
            //打断 p 层和 v层的联系
            mView = null;
            if (models.size() > 0) {
                //掐断网络请求
                for (BaseModel model : models) {
                    model.onDestroy();
                }
                models.clear();
            }
        }
    
        public void addModel(BaseModel model) {
            models.add(model);
        }
    }
    
    

    使用

    ImpLoginPresenter

    public
    class ImpLoginPresenter extends BasePresenter implements LoginPresenter, LoginCallback {
    
        private ImpLoginModel model;
    
        @Override
        public void login(String username, String password) {
            if (TextUtils.isEmpty(username)) {
                mView.onFail("姓名不能为空");
                return;
            }
    
            if (TextUtils.isEmpty(password)) {
                mView.onFail("密码不能为空");
                return;
            }
    
            model.login(username, password, this);
        }
    
        @Override
        protected void initModel() {
            model = new ImpLoginModel();
            addModel(model);
        }
    
        @Override
        public void onSuccess(LoginBean loginBean) {
            mView.onSuccess(loginBean);
        }
    
        @Override
        public void onFail(String error) {
            mView.onFail(error);
        }
    }
    
    

    ImpLoginModel

    public class ImpLoginModel extends BaseModel implements LoginModel {
    
        @Override
        public void login(String username, String password, LoginCallback loginCallback) {
            HttpManager.getHttpManager()
                    .getApiService(ApiService.baseLoginUrl, ApiService.class)//获取接口服务对象
                    .login(username, password)
                    .compose(RxUtil.rxObservableTransformer())//RxUtil 切换线程
                    .subscribe(new BaseObserver<LoginBean>(this) {
                        @Override
                        public void onSuccess(LoginBean loginBean) {
                            int errorCode = loginBean.getErrorCode();
                            if (errorCode == 0) {
                                loginCallback.onSuccess(loginBean);
                            } else {
                                loginCallback.onFail(loginBean.getErrorMsg());
                            }
                        }
    
                        @Override
                        public void onFail(String error) {
                            loginCallback.onFail(error);
                        }
                    });
        }
    }
    

    相关文章

      网友评论

          本文标题:MVP抽取.md

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