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 企业级应用开发中大家耳熟能详的概念-三层架构, ...
随机推荐
- nrm -- NPM registry 管理工具(附带测速功能)
在使用npm时,官方的源下载npm包会比较慢,国内我们基本使用淘宝的源.nrm 是一个 NPM 源管理器,可以允许你快速地在 NPM 源间切换. Install npm install -g nrm ...
- activity四种状态
finish() 使得activity死掉 activity 部分可见进入pause状态.全部不可见进入stop状态 .界面从死亡——运行(启动) MainAdctivity.onCreate.on ...
- sql索引原理以及优化
http://itindex.net/detail/52237-%E7%B4%A2%E5%BC%95-%E5%8E%9F%E7%90%86 http://itindex.net/detail/5171 ...
- “There's no Qt version assigned to this project for platform ” - visual studio plugin for Qt
1.find menu "Qt VS Tools", select Qt Options 2.add a new Qt version 3. right click the tar ...
- YTU 2444: C++习题 对象转换
2444: C++习题 对象转换 时间限制: 1 Sec 内存限制: 128 MB 提交: 914 解决: 581 题目描述 定义一个Teacher(教师)类(教师号,姓名,性别,薪金)和一个St ...
- Python return语句用法分析
return 语句 程序运行到所遇到的第一个return即返回(退出def块),不会再运行第二个return. 要返回两个数值,写成一行即可: def a(x,y): if x==y: return ...
- 常用文件操作模块json,pickle、shelve和XML
一.json 和 pickle模块 用于序列化的两个模块 json,用于字符串 和 python数据类型间进行转换 pickle,用于python特有的类型 和 python的数据类型间进行转换 Js ...
- AtCoder Beginner Contest 057
A题 分析:24进制转换 #include<iostream> using namespace std; int main() { int a,b; while(cin>>a& ...
- Watir: 如果安装sougou浏览器,有可能导致Watir不能工作
如果安装了搜狗,Watir::Browser.new并不一定能打开新的IE浏览器.这种情况下,必须卸载搜狗浏览器,当然,attach,find方法还是可以用的
- 微信小程序-B站:wxml和wxss文件
WXML WXML(WeiXin Markup Language)是微信的一套标签语言,结合基础组件.事件系统,可以构建出页面的结构. (小安娜:好像很厉害的样子,那基础组件.事件系统是什么?感觉更厉 ...