抽mvp

2019-03-25  本文已影响0人  君袅

第一版:

Activity

public abstract class BaseActivity<P extends BasePresenter,V extends BaseMvpView> extends AppCompatActivity {

    protected P presenter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getLayoutId());
        ButterKnife.bind(this);
        presenter=initPresenter();
        if(presenter != null){
            presenter.attachView((V)this);
        }
        initView();
        initData();
        initListener();

    }

    protected void initListener() {
    }

    protected void initData() {
    }

    protected void initView() {

    }
    protected abstract P initPresenter();

    protected abstract int getLayoutId();
}

fragment

public abstract class BaseFragment<P extends BasePresenter,V extends BaseMvpView> extends Fragment {

    protected P presenter;
    private Unbinder unbinder;
    private View view;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        presenter=initPresenter();
        if(presenter != null){
            presenter.attachView((V)this);
        }
        if(view == null){
            view = inflater.inflate(getLayoutID(),null);
            unbinder = ButterKnife.bind(this, view);
            initView(view);
            initData();
        }else {
            unbinder = ButterKnife.bind(this, view);
        }
        return view;
    }

    protected void initData() {}

    protected void initView(View view) {}

    protected abstract P initPresenter();

    protected abstract int getLayoutID();

    @Override
    public void onDestroy() {
        super.onDestroy();
       unbinder.unbind();
       if(presenter !=null){
           presenter.onDestroy();
       }

    }
}

Model

public abstract class BaseModel {
    protected CompositeDisposable mCompositeDisposable = new CompositeDisposable();
    public void onDestory() {
        //掐断所有的网络
        mCompositeDisposable.clear();
    }
}

View

public interface BaseMvpView {
}

Presenter

public abstract class BasePresenter<V extends BaseMvpView>{
    protected V view;

    public void attachView(V view){
        this.view=view;
    };

    public BasePresenter(){
        initModel();
    }

    protected abstract void initModel();


    protected ArrayList<BaseModel> mModels=new ArrayList<>();

    public void onDestroy() {
        view = null;
        if (mModels.size()>0){
            for (BaseModel model :mModels) {
                model.onDestory();
            }
        }
    }

}

接口回调

public interface SynTony<B> {
    /*
     *回调成功
     * */
    void RequestSucceed(B bean);

    /*
     * 回调失败
     * */
    void RequestFailed(String string);
}

第二版:

image.png

--------------------------------------抽取的base层--------------------

1.Application07注册获取上下文

public class Application07 extends Application {

    private static Application07 mApplication;

    @Override
    public void onCreate() {
        super.onCreate();
        mApplication = this;
    }

    public static Application07 getApplication(){
        return mApplication != null ? mApplication : null;
    }

    public static Context getAppContext(){
        return mApplication.getApplicationContext();
    }
}

2.BaseActivity 继承AppCompatActivity:

public class BaseActivity extends AppCompatActivity {

    private Application07 mApplication07;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mApplication07 = (Application07) getApplication();
        Log.e("我的类名是--------", "onCreate: " + this.getClass().getSimpleName());
    }

    public void showToast(String content) {
        Toast.makeText(getApplicationContext(), content, Toast.LENGTH_SHORT).show();
    }
}

3.BaseMvpActivity用来抽取V层基类

public abstract class BaseMvpActivity<P extends BasePresenter,M> extends BaseActivity implements ICommonView {

    private Unbinder mBind;
    public P mPresenter;
    public M mModel;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getLayoutID());
        mBind = ButterKnife.bind(this);
        mPresenter=getPresenter();
        mModel=getModel();
        mPresenter.attach(this,(ICommonModel)mModel);
        initView();
        initData();
    }

    public void initData() {}

    public void initView() {}

    protected abstract M getModel();

    protected abstract P getPresenter();

    protected abstract int getLayoutID();

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mBind.unbind();
        mPresenter.detach();
    }

}

4.BasePresenter是P层的基类

public class BasePresenter<M extends ICommonModel, V extends ICommonView> {

    private WeakReference<V> view;
    private WeakReference<M> model;

    public void attach(V view, M model) {
        this.view = new WeakReference<>(view);
        this.model = new WeakReference<>(model);
    }

    public void detach() {
        if (view != null) {
            view.clear();
            this.view = null;
        }
        if (model != null) {
            model.clear();
            this.model = null;
        }
    }

    public V getView() {
        return view != null ? view.get() : null;
    }

    public M getModel() {
        return model != null ? model.get() : null;
    }

}

5.M层的接口

public interface ICommonModel<T> {
    void getData(ICommonView view,int whichApi,T... t);
}

6.P的接口

public interface ICommonPresenter<T> {
    void getData(int whichApi,T... t);
}

7.V的接口

public interface ICommonView<T> {
    void onError(Throwable e);
    void onResponse(int whichApi,T... t);
}

8.fragent的基层

public abstract class BaseFragment<P extends BasePresenter,M > extends Fragment implements ICommonView{

    public P mPresenter;
    public M mModel;
    private Unbinder mBind;
    private View mView;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        mPresenter=getPresenter();
        mModel = getModle();
        if(mPresenter!=null){
            mPresenter.attach(this, (ICommonModel) mModel);
        }
        if(mView == null){
            mView = inflater.inflate(getLayoutID(), null);
            mBind=ButterKnife.bind(this,mView);
            initView(mView);
            initData();
        }else {
            mBind=ButterKnife.bind(this,mView);
        }
        return mView;
    }



    public void initData() {}
    protected abstract void initView(View view);
    protected abstract int getLayoutID();
    protected abstract M getModle();
    protected abstract P getPresenter();

    @Override
    public void onDestroy() {
        super.onDestroy();
        mBind.unbind();
        if(mPresenter!=null){
            mPresenter.dotach();
        }
    }
}

----------------------------------------------------------##请求接口-----------------------------------------------------------
1.项目中的时候会用不同的一套网络地址,方便更改

public class NetConfig {
    public static String BASEURL;
    public static int type = 2;

    static {
        if (type == 1) {
            BASEURL = "www.baidu.com/";
        } else if (type == 2) {
            BASEURL = "http://gank.io/";
        } else {
            BASEURL = "";
        }
    }
}

2.请求接口

public interface INetService {

    @GET("api/data/%E7%A6%8F%E5%88%A9/10/{pageNum}")
    @Headers("User-Agent:rxl")
    Observable<ImageInfo> getImage(@Path("pageNum") int page);
}

--------------------------------------------------------------使用mvp------------------------------------------------------------------------------

1.P层

public class CommonPresenter extends BasePresenter implements ICommonPresenter,ICommonView {
    @Override
    public void getData(int whichApi, Object... t) {
        if(getModel() != null){
            getModel().getData(this,whichApi,t);
        }else {
            Log.e("net error","found error when excute netWork to used getModel():, "+whichApi);
        }
    }

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

    @Override
    public void onResponse(int whichApi, Object[] o) {
         if(getView() != null){
             getView().onResponse(whichApi,o);
         }else {
             Log.e("onResponse error","getView() found error when onResponse  :"+whichApi);
         }
    }


}

2.M层(因为我们为了代码的简写所以一般一个模块用一个M层请求数据)

public class TestModel implements ICommonModel {
    int page=1;

    @Override
    public void getData(ICommonView view, int whichApi, Object[] t) {
        switch (whichApi) {
            case ApiConfig.TESTAPI:

               final int loadMode = (int)t[0];
                NetManager.getNetManager().netMethod(NetManager.getNetManager().getNetService().getImage(loadMode
                        == LoadConfig.LOADMORE ? page++ : 1), view, whichApi, loadMode);

                break;
            case ApiConfig.TESTAPI_2:
                break;
        }
    }

创建一个ApiConfig 用来标记加载的那个数据

public class ApiConfig {
    public static final int TESTAPI = 0;
    public static final int TESTAPI_2 = 1;
}

用来LoadConfig用来标记请求状态

public class LoadConfig {
    //正常请求
    public static final int NORMAL = 100;
    //刷新
    public static final int REFRESH = 101;
    //加载更多
    public static final int LOADMORE = 102;
}

3.V层的使用

public class SplashActivity extends BaseMvpActivity<CommonPresenter,TestModel> implements ICommonView, XRecyclerView.LoadingListener {

    @BindView(R.id.recyclerView)
    XRecyclerView recyclerView;
    List<ImageInfo.ResultsBean> mBeanList = new ArrayList<>();
    private ImageAdapter mAdapter;

    @Override
    public int getLayoutId() {
        return R.layout.activity_splash;
    }

    @Override
    public void initData() {
        mPresenter.getData(ApiConfig.TESTAPI, LoadConfig.NORMAL);
        mPresenter.getData(ApiConfig.TESTAPI_2, LoadConfig.NORMAL);
    }

    @Override
    public CommonPresenter getPresenter() {
        return new CommonPresenter();
    }

    @Override
    public TestModel getModel() {
        return new TestModel();
    }

    @Override
    public void initView() {
        StaggeredGridLayoutManager manager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(manager);
        recyclerView.setLoadingListener(this);
        mAdapter = new ImageAdapter(mBeanList, this);
        recyclerView.setAdapter(mAdapter);
    }

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

    @Override
    public void onResponse(int whichApi, Object[] t) {
        switch (whichApi) {
            case ApiConfig.TESTAPI:
                ImageInfo info = (ImageInfo) t[0];
                int loadType = (int) t[1];
                if (loadType == LoadConfig.REFRESH) {
                    recyclerView.refreshComplete();
                    mBeanList.clear();
                } else if (loadType == LoadConfig.NORMAL) recyclerView.loadMoreComplete();
                mBeanList.addAll(info.getResults());
                mAdapter.notifyDataSetChanged();
                break;
            case ApiConfig.TESTAPI_2:

                break;
        }

    }

    @Override
    public void onRefresh() {
        mPresenter.getData(ApiConfig.TESTAPI, LoadConfig.REFRESH);
    }

    @Override
    public void onLoadMore() {
        mPresenter.getData(ApiConfig.TESTAPI, LoadConfig.LOADMORE);
    }
}

----------------------------------------M层中使用啦对retrofit的抽取--------------------------------------------------------------

NetManager 抽取

public class NetManager {

    private static volatile NetManager sNetManager;

    private NetManager() {
    }

    public static NetManager getNetManager() {
        if (sNetManager == null) {//考虑效率问题
            synchronized (NetManager.class) {
                if (sNetManager == null) {//考虑多个线程问题
                    sNetManager = new NetManager();
                }
            }
        }
        return sNetManager;
    }

    public INetService getNetService() {
        INetService service = new Retrofit.Builder()
                .baseUrl(NetConfig.BASEURL)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build().create(INetService.class);
        return service;
    }

    public <T> void netMethod(Observable<T> observable, final ICommonView view, final int whichApi, final int p) {
        observable.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new BaseObserver() {
                    @Override
                    public void onNetError(Throwable e) {
                        view.onError(e);
                    }

                    @Override
                    protected void onNetSuccess(Object value) {
                        view.onResponse(whichApi, value, p);
                    }
                });
    }

}

订阅

public abstract class BaseObserver implements Observer {

    private Disposable d;

    public abstract void onNetError(Throwable e);

    protected abstract void onNetSuccess(Object value);

    @Override
    public void onSubscribe(Disposable d) {
        this.d = d;
    }

    @Override
    public void onNext(Object value) {
        onNetSuccess(value);
        dispose();
    }

    @Override
    public void onError(Throwable e) {
        onNetError(e);
        dispose();
    }

    @Override
    public void onComplete() {

    }

    private void dispose() {
        if (d != null && !d.isDisposed()) {
            d.dispose();
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读