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();
}
}
最后
这里也有人说接口请求数据不应该写在Presenter里面。。。总之 好的架构一定是:1 适合自己的项目 2 多写注释文档 3 业务逻辑分包 4 不断学习。
欢迎加群:
QQ 群 521039620
原文博客地址
Android开发-浅谈架构(二)的更多相关文章
- Android开发-浅谈架构(一)
写在前面的话 嗯 聊聊架构. 这段时间一直在维护旧项目. 包括自己之前写的新项目 越来越发现 一个架构清晰的项目往往让人赏心悦目.不至于在一个bug丢过来之后手足无措.包括以后别人接收自己的项目 能很 ...
- Delphi 组件渐进开发浅谈(二)——双简合璧
2.双简合璧2.1.带有T[x]Label的T[x]Edit组件 请允许我用[x]的书写方式来表示不同的对象.因为随后将大量提及TLabeledEdit与TTntLabeledEdit.TCustom ...
- Medium开发团队谈架构设计_转
转自:Medium开发团队谈架构设计 背景 说到底,Medium是个社交网络,人们可以在这里分享有意思的故事和想法.据统计,目前累积的用户阅读时间已经超过14亿分钟,合两千六百年. 我们支持着每个月两 ...
- Python测试开发-浅谈如何自动化生成测试脚本
Python测试开发-浅谈如何自动化生成测试脚本 原创: fin 测试开发社区 前天 阅读文本大概需要 6.66 分钟. 一 .接口列表展示,并选择 在右边,点击选择要关联的接口,区分是否要登录, ...
- 【Android开发VR实战】二.播放360°全景视频
转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53924006 本文出自[DylanAndroid的博客] [Android开发 ...
- springboot开发浅谈 2021/05/11
学习了这么久,本人希望有时间能分享一下,这才写下这篇浅谈,谈谈软件,散散心情. 这是本人的博客园账号,欢迎关注,一起学习. 一开始学习springboot,看了好多网站,搜了好多课程.零零落落学了一些 ...
- Android开发学习笔记(二)——编译和运行原理(1)
http://www.cnblogs.com/Pickuper/archive/2011/06/14/2078969.html 接着上一篇的内容,继续从全局了解Android.在清楚了Android的 ...
- Android开发 - 掌握ConstraintLayout(二)介绍
介绍 发布时间 ConstraintLayout是在2016的Google I/O大会上发布的,经过这么长时间的更新,现在已经非常稳定. 支持Android 2.3(API 9)+ 目前的Androi ...
- JAVAEE企业级应用开发浅谈第二辑:MVC和三层架构
上海尚学堂警句:一份信心,一份努力,一份成功:十分信心,十分努力,十分成功. Step1.情景概要 Hello,小伙伴们,昨天跟大家分享了JAVA EE 企业级应用开发中大家耳熟能详的概念-三层架构, ...
随机推荐
- 在安卓6.0(及以上)设备上无法获取无线网卡MAC地址的解决方案
在安卓6.0以下的设备上,通过WifiManager.getConnectionInfo().getMacAddress()即可获取WLAN物理地址, 而在6.0及以上,以此方式获取到的MAC地址为固 ...
- gravity layout_gravity
gravity:控制当前视图的内容/子view layout_gravity:控制视图本身
- react项目中的注意点
一.ES6 的编译方法 目前主流的浏览器还不支持ES6. 现在一般采用webpack 和 <script type="text/babel">对jsx 语法进行编译, ...
- ES6 一些新特性的总结
一.箭头函数 ES6中新增了一个箭头函数 ()=>,箭头函数通俗点讲就是匿名函数.箭头函数还有不同点在于改变函数中this,和js中的.bind 的方法差不多,继承后指向的不是最新的函数, ...
- ⭐register_chrdev、register_chrdev_region以及alloc_chrdev_region之间的区别
register_chrdev:Linux2.6.30之前所用,不用定义cdev:但 如果是register_chrdev 注册的话,这个时候,分配的次设备号,是从0~255,这样子的话,就分配的范围 ...
- 随机生成50个字段的elasticsearch的测试程序输入
词典位置:https://raw.githubusercontent.com/jonbcard/scrabble-bot/master/src/dictionary.txt import json f ...
- .NET 4.0 System.Threading.Tasks学习笔记
由于工作上的需要,学习使用了System.Threading.Tasks的使用,特此笔记下来. System.Threading.Tasks的作用: Tasks命名空间下的类试图使用任务的概念来解决线 ...
- 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 ...
- MySql数据库知识点
关系型数据库管理系统简介 为什么使用数据库 1.降低存储数据的冗余度 2.更高的数据一致性 3.存储的数据可以共享 4.可以建立数据库所遵循的标准 5.便于维护数据完整性 6.能够实现数据的安全性 数 ...
- Codechef SEPT17
Codechef SEPT17 比赛链接:https://www.codechef.com/SEPT17 CHEFSUM code给定数组 a[1..n] ,求最小的下标 i ,使得 prefixsu ...