osi length github上 com script case subscript app
我记得有一期罗胖的《罗辑思维》中他提到 我们在这个碎片化 充满焦虑的时代该怎么学习--用30%的时间 了解70%该领域的知识然后迅速转移芳草鲜美的地方 像游牧民族那样。原话应该不是这样,但是我想说的是 自从我想写一些笔记记录知识的时候 为了不误导其他人 我不得不参考github 一些比较知名大牛的代码。在这个过程中 我下载过很多demo.一点一点的啃 汲取精华的部分 当然也充满疑惑。后来觉得标题取得有点大了 我应该取"学习"类的标题才对。但是另一方面我也只能就我目前的认知来记录我这个阶段的水平 也就是所谓的"浅聊"。也许你看到我github上面的demo 会说 这TM写的真垃圾。 我相信过段时间当我在github上不经意的搜到自己的demo的时候我肯定会说 “这是哪个傻逼写的代码。。。” 后来一看是我自己写的。 如果我不这么觉得 那才真是不幸。
为了学习MVP 我利用业余时间搭建了 仿照 ONE 一个 app 来练手。用到 Dagger2+RxJava+Retrofit+Databinding.细节还有待完善。在Android开发-浅谈架构(一)中 我当时参考写了MVP fragment切换presenter.但是经过一个星期的学习 我转眼推翻了 前面的写法。这里 我觉得有必要说一下我这段时间学习其他人写的MVP模式demo. 有建议把view层当做presenter一样(github上面一个外国哥们 这里就不给记录了) 后来参考 google todoapp MVP+RxJava以及国内大牛的一些博客及时更正了github上面的代码。仿 ONE一个
下面贴出具体模块 欢迎批评和讨论。
/* tab标签页面切换*/public class HomeActivity extends BaseActivity
/* 绑定布局文件 @return/@Overrideprotected int getLayoutId() {return R.layout.home_act;}
/* 创建Presenter*/@Overrideprotected void setupView() {new MainTabPresenter(this,this,mBinding.radio);}
/* view 层接口/@NonNullprivate MainTabContract.Presenter mainTabPresenter;@Overridepublic void setPresenter(MainTabContract.Presenter presenter) {mainTabPresenter = checkNotNull(presenter);}
@Overrideprotected void onResume() {super.onResume();mainTabPresenter.subscribe();}
@Overrideprotected void onPause() {super.onPause();mainTabPresenter.unsubscribe();}
@Overrideprotected void onDestroy() {super.onDestroy();mainTabPresenter.unsubscribe();}
/* 返回处理 */private long beforeTime = 0L;@Overridepublic void onBackPressed() {// thanks.==> by JohnTsai(mailto:[email protected]) on 16/7/27.if(System.currentTimeMillis()-beforeTime<1000L) { finish(); super.onBackPressed(); }else{ beforeTime = System.currentTimeMillis(); Toast.makeText(this, "再按一次退出一个", Toast.LENGTH_SHORT).show(); } } }
public class MainTabPresenter implements MainTabContract.Presenter {
@NonNullprivate final RadioGroup radioGroup;
@NonNullprivate final MainTabContract.View mMainTabContractView;
@NonNullprivate final FragmentActivity mContext;
@NonNullprivate CompositeSubscription mSubscriptions;
public MainTabPresenter(@NonNull FragmentActivity mActivity, @NonNull MainTabContract.View view,@NonNull RadioGroup group) {//mContext = checkNotNull(mActivity, "FragmentActivity cannot be null!");mMainTabContractView = checkNotNull(view);radioGroup = checkNotNull(group, "RadioGroup cannot be null!");mSubscriptions = new CompositeSubscription();mMainTabContractView.setPresenter(this);}
private void switchTo() {FragmentUtils fragmentUtil = new FragmentUtils(mContext, R.id.view_container);Subscription subscription = RxRadioGroup.checkedChanges(radioGroup).subscribe(integer -> {fragmentUtil.switchTo(switchTo(integer));});mSubscriptions.add(subscription);}
private Class switchTo(@IdRes Integer i) {Integer integer = checkNotNull(i, "switchTo IdRes cannot be null");switch (integer) {case R.id.home_one:return OneFragment.class;case R.id.home_reading:return ReadingFragment.class;case R.id.home_music:return MusicFragment.class;case R.id.home_movie:return MovieFragment.class;default:break;}return null;}
@Overridepublic void subscribe() {switchTo();}
@Overridepublic void unsubscribe() {mSubscriptions.clear();}}
/* 一个 首页/public class OneFragment extends BaseFragment implements ViewPagerContract.View{
@NonNullprivate ViewPagerContract.Presenter mPresenter;
@Overrideprotected int getLayoutId() {return R.layout.main_fragment_one;}
@Overrideprotected void setupView() {new ViewPagerPresenter(getActivity(),this);}
@Overridepublic void setPagerAdapter(@NonNull OneFragmentAdapter oneFragmentAdapter) {inflate.viewPager.setAdapter(checkNotNull(oneFragmentAdapter));}
@Overridepublic void onResume() {super.onResume();mPresenter.subscribe();}
@Overridepublic void onPause() {super.onPause();mPresenter.unsubscribe();}
@Overridepublic void setPresenter(ViewPagerContract.Presenter presenter) {mPresenter = checkNotNull(presenter);}}
public class ViewPagerPresenter implements ViewPagerContract.Presenter {
@NonNullprivate final CompositeSubscription mSubscriptions;@NonNullprivate final ViewPagerContract.View mViewPagerContractView;@NonNullprivate final ApiInteractor api;@Nullableprivate final FragmentActivity mActivity;
public ViewPagerPresenter(@NonNull FragmentActivity context, @NonNull ViewPagerContract.View mView){mActivity = checkNotNull(context);api = checkNotNull(App.getAppComponent().getApiInteractor());mViewPagerContractView = checkNotNull(mView);mSubscriptions = new CompositeSubscription();mViewPagerContractView.setPresenter(this);}
@Overridepublic void subscribe() {Subscription apiOneHome = api.getOneHome(ConstantApi.OneFragmentApi, new BaseSubscribe
@Overridepublic void unsubscribe() {mSubscriptions.clear();}}
github具体代码
这里也有人说接口请求数据不应该写在Presenter里面。。。总之 好的架构一定是:1 适合自己的项目 2 多写注释文档 3 业务逻辑分包 4 不断学习。
欢迎加群:QQ 群 521039620原文博客地址
Android开发-浅谈架构(二)
来源: http://www.bubuko.com/infodetail-2066163.html