写在前面的话

我记得有一期罗胖的《罗辑思维》中他提到 我们在这个碎片化 充满焦虑的时代该怎么学习--用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
原文博客地址

Android开发-浅谈架构(二)的更多相关文章

  1. Android开发-浅谈架构(一)

    写在前面的话 嗯 聊聊架构. 这段时间一直在维护旧项目. 包括自己之前写的新项目 越来越发现 一个架构清晰的项目往往让人赏心悦目.不至于在一个bug丢过来之后手足无措.包括以后别人接收自己的项目 能很 ...

  2. Delphi 组件渐进开发浅谈(二)——双简合璧

    2.双简合璧2.1.带有T[x]Label的T[x]Edit组件 请允许我用[x]的书写方式来表示不同的对象.因为随后将大量提及TLabeledEdit与TTntLabeledEdit.TCustom ...

  3. Medium开发团队谈架构设计_转

    转自:Medium开发团队谈架构设计 背景 说到底,Medium是个社交网络,人们可以在这里分享有意思的故事和想法.据统计,目前累积的用户阅读时间已经超过14亿分钟,合两千六百年. 我们支持着每个月两 ...

  4. Python测试开发-浅谈如何自动化生成测试脚本

    Python测试开发-浅谈如何自动化生成测试脚本 原创: fin  测试开发社区  前天 阅读文本大概需要 6.66 分钟. 一 .接口列表展示,并选择 在右边,点击选择要关联的接口,区分是否要登录, ...

  5. 【Android开发VR实战】二.播放360&#176;全景视频

    转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53924006 本文出自[DylanAndroid的博客] [Android开发 ...

  6. springboot开发浅谈 2021/05/11

    学习了这么久,本人希望有时间能分享一下,这才写下这篇浅谈,谈谈软件,散散心情. 这是本人的博客园账号,欢迎关注,一起学习. 一开始学习springboot,看了好多网站,搜了好多课程.零零落落学了一些 ...

  7. Android开发学习笔记(二)——编译和运行原理(1)

    http://www.cnblogs.com/Pickuper/archive/2011/06/14/2078969.html 接着上一篇的内容,继续从全局了解Android.在清楚了Android的 ...

  8. Android开发 - 掌握ConstraintLayout(二)介绍

    介绍 发布时间 ConstraintLayout是在2016的Google I/O大会上发布的,经过这么长时间的更新,现在已经非常稳定. 支持Android 2.3(API 9)+ 目前的Androi ...

  9. JAVAEE企业级应用开发浅谈第二辑:MVC和三层架构

    上海尚学堂警句:一份信心,一份努力,一份成功:十分信心,十分努力,十分成功. Step1.情景概要 Hello,小伙伴们,昨天跟大家分享了JAVA EE 企业级应用开发中大家耳熟能详的概念-三层架构, ...

随机推荐

  1. Cocos2d-js异步图片加载

    这里说的是在需要的使用加载图片,比如游戏中的某个关卡的图片,不用在游戏一开始就加载(万一用户玩不到那关,岂不是很冤,流量费了那么多),否则 载入速度也慢.这种方式加载资源要用到cc.loader官方文 ...

  2. MongoDB and Redis

    简介 MongoDB更类似MySQL,支持字段索引.游标操作,其优势在于查询功能比较强大,擅长查询JSON数据,能存储海量数据,但是不支持事务. Mysql在大数据量时效率显著下降,MongoDB更多 ...

  3. 编写自定义PE结构的程序(如何手写一个PE,高级编译器都是编译好的PE头部,例如MASM,TASM等,NASM,FASM是低级编译器.可以自定义结构)

    正在学PE结构...感谢个位大哥的文章和资料...这里先说声谢谢 一般高级编译器都是编译好的PE头部,例如MASM,TASM等一直都说NASM,FASM是低级编译器.可以自定义结构但是苦于无人发布相关 ...

  4. VC实现趋势图绘制

    本文参考pudn上一个完整工程,在pudn搜索“50815867CurveDrawing”即可找到源代码.   上图是使用VS2010重写了该软件后的效果图,下面再贴出关键代码: // Plot.cp ...

  5. Java DES加密解密

    import javax.crypto.Cipher; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpe ...

  6. 数据结构之 图论---bfs(邻接表)

    数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索( ...

  7. 「NOIP2014」「LuoguP2296」 寻找道路

    Description 在有向图 G 中,每条边的长度均为 1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 路径上的所有点的出边所指向的点都直接或间接与终点连通. 在 ...

  8. 【转】 IntelliJ IDEA 中 Project 和 Module 的概念及区别

    原文地址:https://blog.csdn.net/qq_35246620/article/details/65448689 在 IntelliJ IDEA 中,没有类似于 Eclipse 工作空间 ...

  9. Eclipse中删除导入的jar包,总是报错?已解决!

    参考百度经验 http://jingyan.baidu.com/article/851fbc37c7512e3e1f15abec.html

  10. python的time模块使用

    在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括:time,datetime以及calendar.这篇文章,主要讲解time模块. 在开始之前,首先要说明这几点: ...