Mvp实战心得(二)---Base基类的封装
来源:互联网 发布:在线支付网站源码 编辑:程序博客网 时间:2024/06/03 15:22
转载请标明出处:http://www.jianshu.com/p/651146bd0688本文出自:Jlanglang
基类:
在开发中有着很重要的地位,基类设计封装的好,不管是对app的性能,还是对开发的效率都有着很重要的作用
基类可以简单几个字概况,一个良好的父类.
结构:
不管你的app是多个acitivity,还是1个activity+n个fragment,还是多个acitivity多个fragment.
始终都是用的acitivity和fragment.
根据项目的不同,基类不可能完全相同,但很多还是可以通用的.
抽取:
既然是mvp,那么不管是acitivity还是fragment.都归于v既然是v,那么就应该有相对应的presenter,view那么基类应该有:BaseActivityViewBaseFragmentViewBaseViewBasePresenter
具体代码:
BaseActivity
public abstract class BaseActivity<T extends BasePresenter> extends AppCompatActivity implements BaseActivityView { protected T mPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //创建Presenter mPresenter = initPresenter(); //类似fragment的绑定.拿到引用 mPresenter.onAttch(this); //初始化acitivity, onCreateActivity(savedInstanceState); //初始化Presenter mPresenter.onCreate(); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); mPresenter.onSaveInstanceState(outState); } @Override protected void onDestroy() { mPresenter.onDestroy(); mPresenter.onDetach(); super.onDestroy(); } @Override public BaseActivity getActivity() { return this; } /** * 创建prensenter * @return <T extends BasePresenter> 必须是BasePresenter的子类 */ protected abstract T initPresenter(); /** * 子类必须实现,并初始化Activity,比如setContentView() */ protected abstract void onCreateActivity(Bundle savedInstanceState); @Override public void isNightMode(boolean isNight) { }}
BaseFragment
稍微复杂一点.
public abstract class BaseFragment<T extends BasePresenter> extends Fragment implements BaseFragmentView { protected T mPresenter; protected Context mContext;//activity的上下文对象 protected Bundle mBundle; @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); if (mBundle != null) { outState.putBundle("bundle", mBundle); } } /** * 绑定activity * * @param context */ @Override public void onAttach(Context context) { super.onAttach(context); mContext = context; } /** * 运行在onAttach之后 * 可以接受别人传递过来的参数,实例化对象. * * @param savedInstanceState */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //获取bundle,并保存起来 if (savedInstanceState != null) { mBundle = savedInstanceState.getBundle("bundle"); } else { mBundle = getArguments() == null ? new Bundle() : getArguments(); } //创建presenter mPresenter = initPresenter(); } /** * 运行在onCreate之后 * 生成view视图 */ @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return initView(inflater, container, savedInstanceState); } /** * 运行在onCreateView之后 * 加载数据 */ @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); //由于fragment生命周期比较复杂,所以Presenter在onCreateView创建视图之后再进行绑定,不然会报空指针异常 mPresenter.onAttch(this); mPresenter.onCreate(); } @Override public void onDestroyView() { mPresenter.onDestroy(); super.onDestroyView(); } @Override public void onDetach() { mPresenter.onDetach(); super.onDestroyView(); } /** * 跳转fragment * * @param tofragment */ @Override public void startFragment(Fragment tofragment) { startFragment(tofragment, null); } /** * @param tofragment 跳转的fragment * @param tag fragment的标签 */ @Override public void startFragment(Fragment tofragment, String tag) { FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); fragmentTransaction.hide(this).add(android.R.id.content, tofragment, tag); fragmentTransaction.addToBackStack(tag); fragmentTransaction.commitAllowingStateLoss(); } /** * 类似Activity的OnBackgress * fragment进行回退 */ public void onBack() { getFragmentManager().popBackStack(); } /** * 初始化Fragment应有的视图 * * @return */ public abstract View initView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState); /** * 创建prensenter * * @return <T extends BasePresenter> 必须是BasePresenter的子类 */ public abstract T initPresenter(); @Override public Context getContext() { return mContext; } @Override public Bundle getBundle() { return mBundle; } @Override public BaseFragment getFragment() { return this; }}
再看看BaseView
public interface BaseView { /** * 切换夜间模式 * @param isNight 是否切换为夜间模式 */ void isNightMode(boolean isNight);}
BaseView得想好做什么事,必须是你的项目里所有view都有的共性
不仅是acitivity和fragment,还有控件
-----------------------------------------------------------------------------------------------------
关键的BasePresenter来了
/** * @author jlanglang 2016/11/11 15:10 */public abstract class BasePresenter<T extends BaseView> { protected T mView; /** * 绑定View */ public void onAttch(T view) { this.mView = view; } /** * 做初始化的操作,需要在V的视图初始化完成之后才能调用 * presenter进行初始化. */ public abstract void onCreate(); /** * 在这里结束异步操作 */ public void onDestroy(){ } /** * 在V销毁的时候调用,解除绑定 */ public void onDetach() { mView = null; } /** * 容易被回收掉时保存数据 */ public abstract void onSaveInstanceState(Bundle outState);}
看看Acitivity的使用:
//创建的时候写好泛型实现好抽象方法就行,多么简单.public class MainActivity extends BaseActivity<MainActivityPresenterImpl> implements MainActivityContract.View { @Override protected MainActivityPresenterImpl initPresenter() { return new MainActivityPresenterImpl(); } @Override protected void onCreateActivity(Bundle savedInstanceState) { setContentView(R.layout.activity_main); }}
最后是对应的MainActivityPresenterImpl以及MainActivityContract
public class MainActivityPresenterImpl extends BasePresenter<MainActivityContract.View> implements MainActivityContract.Presenter { @Override public void onCreate() { } @Override public void onSaveInstanceState(Bundle outState) { }}
public class MainActivityContract { public interface View extends BaseActivityView { } public interface Presenter{ } public interface Model { }}
总结:
对于BasePresenter一开始我是写成接口形式的,
后来使用过程中,发现很麻烦,每次绑定View,释放View都需要重复造轮子.
仔细想想,抽象类更合适,
每个Presenter继承BasePresenter,实现Contract中的接口为其补充最后会发现,view和presenter的结构一样.基类作为复用,接口作为补充.
作者:Jlanglang
链接:http://www.jianshu.com/p/651146bd0688
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
阅读全文
0 0
- MVP实战心得(二)---Base基类的封装
- MVP实战心得(二)---Base基类的封装
- Mvp实战心得(二)---Base基类的封装
- MVP实战心得(三)---封装Retrofit2.0+RxAndroid+RxBus
- MVP实战心得(四)---封装优化,拆分Toolbar与ContentView
- MVP实战心得(三)---封装Retrofit2.0+RxAndroid+RxBus
- MVP实战心得(四)---封装优化,拆分Toolbar与ContentView
- MVP实战心得(三)---封装Retrofit2.0+RxAndroid+RxBus
- Base封装(一)--我的最简MVP架构
- Base封装之我的最简MVP架构
- MVP实战心得(一)
- MVP实战心得(一)
- Base封装(二)-- 封装属于自己的Library(UI篇)
- SSM 封装base(二) -封装分页
- RxBus-mvp模式下对Rxjav的封装(二)
- Android 当中的 MVP 模式(二)封装
- Simple的MVP封装
- mvp封装的OKhttp
- Linux 常用命令记录
- H5页面
- 解决安装MySQL进行写入配置文件时卡住或报错问题
- 我是如何入门Git?
- Python 初体验 基本语法
- Mvp实战心得(二)---Base基类的封装
- C++ Primer Notes
- decode-ways Java code
- 刷题#R9
- Android编译系统参考手册
- 兼容ie8的多文件上传
- [arc082f]Sandglass
- UnicodeDecodeError: 'gbk' codec can't decode byte 0xa4 in position 18: illegal multibyte sequence
- 函数回调机制、异步函数回调机制图例详解