写在前面的话

我记得有一期罗胖的《罗辑思维》中他提到 我们在这个碎片化 充满焦虑的时代该怎么学习--用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. 在安卓6.0(及以上)设备上无法获取无线网卡MAC地址的解决方案

    在安卓6.0以下的设备上,通过WifiManager.getConnectionInfo().getMacAddress()即可获取WLAN物理地址, 而在6.0及以上,以此方式获取到的MAC地址为固 ...

  2. gravity layout_gravity

    gravity:控制当前视图的内容/子view layout_gravity:控制视图本身

  3. react项目中的注意点

    一.ES6 的编译方法 目前主流的浏览器还不支持ES6. 现在一般采用webpack 和 <script type="text/babel">对jsx  语法进行编译, ...

  4. ES6 一些新特性的总结

    一.箭头函数 ES6中新增了一个箭头函数   ()=>,箭头函数通俗点讲就是匿名函数.箭头函数还有不同点在于改变函数中this,和js中的.bind  的方法差不多,继承后指向的不是最新的函数, ...

  5. ⭐register_chrdev、register_chrdev_region以及alloc_chrdev_region之间的区别

    register_chrdev:Linux2.6.30之前所用,不用定义cdev:但 如果是register_chrdev 注册的话,这个时候,分配的次设备号,是从0~255,这样子的话,就分配的范围 ...

  6. 随机生成50个字段的elasticsearch的测试程序输入

    词典位置:https://raw.githubusercontent.com/jonbcard/scrabble-bot/master/src/dictionary.txt import json f ...

  7. .NET 4.0 System.Threading.Tasks学习笔记

    由于工作上的需要,学习使用了System.Threading.Tasks的使用,特此笔记下来. System.Threading.Tasks的作用: Tasks命名空间下的类试图使用任务的概念来解决线 ...

  8. VC++读写文件

    目录 第1章读写文件    1 1.1 API    1 1.2 低级IO    1 1.2.1 文件序号    1 1.2.2 文本文件与二进制文件    1 1.3 流IO    2 1.4 Un ...

  9. MySql数据库知识点

    关系型数据库管理系统简介 为什么使用数据库 1.降低存储数据的冗余度 2.更高的数据一致性 3.存储的数据可以共享 4.可以建立数据库所遵循的标准 5.便于维护数据完整性 6.能够实现数据的安全性 数 ...

  10. Codechef SEPT17

    Codechef SEPT17 比赛链接:https://www.codechef.com/SEPT17 CHEFSUM code给定数组 a[1..n] ,求最小的下标 i ,使得 prefixsu ...