zoukankan      html  css  js  c++  java
  • Android开发-浅谈架构(二)

    写在前面的话

    我记得有一期罗胖的《罗辑思维》中他提到 我们在这个碎片化 充满焦虑的时代该怎么学习--用30%的时间 了解70%该领域的知识然后迅速转移芳草鲜美的地方 像游牧民族那样。原话应该不是这样,但是我想说的是 自从我想写一些笔记记录知识的时候 为了不误导其他人 我不得不参考github 一些比较知名大牛的代码。在这个过程中 我下载过很多demo.一点一点的啃 汲取精华的部分 当然也充满疑惑。后来觉得标题取得有点大了 我应该取"学习"类的标题才对。但是另一方面我也只能就我目前的认知来记录我这个阶段的水平 也就是所谓的"浅聊"。也许你看到我github上面的demo 会说 这TM写的真垃圾。 我相信过段时间当我在github上不经意的搜到自己的demo的时候我肯定会说 “这是哪个傻逼写的代码。。。” 后来一看是我自己写的。 如果我不这么觉得 那才真是不幸。

    MVP

    为了学习MVP 我利用业余时间搭建了 仿照 ONE 一个 app 来练手。用到 Dagger2+RxJava+Retrofit+Databinding.细节还有待完善。
    Android开发-浅谈架构(一)中 我当时参考写了MVP fragment切换presenter.但是经过一个星期的学习 我转眼推翻了 前面的写法。这里 我觉得有必要说一下我这段时间学习其他人写的MVP模式demo. 有建议把view层当做presenter一样(github上面一个外国哥们 这里就不给记录了) 后来参考 google todoapp MVP+RxJava以及国内大牛的一些博客及时更正了github上面的代码。仿 ONE一个

    下面贴出具体模块 欢迎批评和讨论。

    HomeActivity 中切换fragment:

    /* tab标签页面切换*/
    public class HomeActivity extends BaseActivity<HomeActBinding> implements MainTabContract.View {

    /绑定布局文件 @return/
    @Override
    protected int getLayoutId() {
    return R.layout.home_act;
    }

    /* 创建Presenter*/
    @Override
    protected void setupView() {
    new MainTabPresenter(this,this,mBinding.radio);
    }

    /* view 层接口/
    @NonNull
    private MainTabContract.Presenter mainTabPresenter;
    @Override
    public void setPresenter(MainTabContract.Presenter presenter) {
    mainTabPresenter = checkNotNull(presenter);
    }

    @Override
    protected void onResume() {
    super.onResume();
    mainTabPresenter.subscribe();
    }

    @Override
    protected void onPause() {
    super.onPause();
    mainTabPresenter.unsubscribe();
    }

    @Override
    protected void onDestroy() {
    super.onDestroy();
    mainTabPresenter.unsubscribe();
    }

    /* 返回处理 */
    private long beforeTime = 0L;
    @Override
    public void onBackPressed() {// thanks.==> by JohnTsai(mailto:johntsai.work@gmail.com) on 16/7/27.
    if(System.currentTimeMillis()-beforeTime<1000L) { finish(); super.onBackPressed(); }else{ beforeTime = System.currentTimeMillis(); Toast.makeText(this, "再按一次退出一个", Toast.LENGTH_SHORT).show(); } } }

    MainTabPresenter

    public class MainTabPresenter implements MainTabContract.Presenter {

    @NonNull
    private final RadioGroup radioGroup;

    @NonNull
    private final MainTabContract.View mMainTabContractView;

    @NonNull
    private final FragmentActivity mContext;

    @NonNull
    private 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;
    }

    @Override
    public void subscribe() {
    switchTo();
    }

    @Override
    public void unsubscribe() {
    mSubscriptions.clear();
    }
    }


    OneFragment 中请求首页数据

    /* 一个 首页/
    public class OneFragment extends BaseFragment<MainFragmentOneBinding> implements ViewPagerContract.View{

    @NonNull
    private ViewPagerContract.Presenter mPresenter;

    @Override
    protected int getLayoutId() {
    return R.layout.main_fragment_one;
    }

    @Override
    protected void setupView() {
    new ViewPagerPresenter(getActivity(),this);
    }

    @Override
    public void setPagerAdapter(@NonNull OneFragmentAdapter oneFragmentAdapter) {
    inflate.viewPager.setAdapter(checkNotNull(oneFragmentAdapter));
    }

    @Override
    public void onResume() {
    super.onResume();
    mPresenter.subscribe();
    }

    @Override
    public void onPause() {
    super.onPause();
    mPresenter.unsubscribe();
    }

    @Override
    public void setPresenter(ViewPagerContract.Presenter presenter) {
    mPresenter = checkNotNull(presenter);
    }
    }

    ViewPagerPresenter

    public class ViewPagerPresenter implements ViewPagerContract.Presenter {

    @NonNull
    private final CompositeSubscription mSubscriptions;
    @NonNull
    private final ViewPagerContract.View mViewPagerContractView;
    @NonNull
    private final ApiInteractor api;
    @Nullable
    private 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);
    }

    @Override
    public void subscribe() {
    Subscription apiOneHome = api.getOneHome(ConstantApi.OneFragmentApi, new BaseSubscribe<String>() {
    @Override
    public void onSuccess(String result) {
    Log.d("首页接口", "onSuccess: " + result);
    if(result!=null){
    OneFragmentEntity entity = new Gson().fromJson(result, OneFragmentEntity.class);
    mViewPagerContractView.setPagerAdapter(new OneFragmentAdapter(mActivity,entity.getData()));
    }
    }
    });
    mSubscriptions.add(apiOneHome);
    }

    @Override
    public void unsubscribe() {
    mSubscriptions.clear();
    }
    }

    github具体代码

    最后

    这里也有人说接口请求数据不应该写在Presenter里面。。。总之 好的架构一定是:1 适合自己的项目 2 多写注释文档 3 业务逻辑分包 4 不断学习。

    欢迎加群:
    QQ 群 521039620
    原文博客地址

  • 相关阅读:
    Java 中位移运算符 >>,>>>,<<
    HashMap 源码解读
    CentOS 配置防火墙操作实例(启、停、开、闭端口)
    CentOS 配置防火墙操作实例(启、停、开、闭端口)
    js实现页面重新加载
    js实现页面重新加载
    关于Ajax的技术组成与核心原理
    关于Ajax的技术组成与核心原理
    PHP水印制作
    PHP水印制作
  • 原文地址:https://www.cnblogs.com/yizuochengchi2012/p/6846566.html
Copyright © 2011-2022 走看看