《Android权威编程指南第3版》今天学习到第10章,感叹经验丰富的编程理念——解耦合。

编程理念肯定是尽可能解除耦合,让代码可以复用,书中多次提到关于参数传递的解耦,这又出现一次。

本章内容以Fragment为主,讲解如何从Fragment中调用其他Activity并传递参数crime_id。(PS:我以为直接通过FragmentManager加载,没想到还是调用Activity)


以上为背景,下面代码片段:

1.从实现RecyclerView的Fragment中,点击标签调用详情显示的Activity。

public void onClick(View v) {
Intent intent = CrimeActivity.newIntent(getActivity(),mCrime.getId());
startActivity(intent);
}

Holder中的Onclick,注意红色部分,相关代码实现如下:

private static final String EXTRA_CRIME_ID =
"com.aocshallo.cp7.crimeactivity.crime_id";
public static Intent newIntent(Context pageContext, UUID crime_id){
Intent intent = new Intent(pageContext, CrimeActivity.class);
intent.putExtra(EXTRA_CRIME_ID, crime_id);
return intent;
}

以上内容完全可以直接录入到Holder当中,但这样带来信息的绑定,因为Holder并不关心你是如何实现的,它关心的是我要给你什么参数,至于实现过程是和Holder没有任何关系的,如果直接写入Holder,Holder就和Activity绑定,不利于解耦。所以,定义了一个静态方法newIntent,它的作用是实现初始化Intent,对相关参数处理(将crime_id存入Extra中),这样做Holder就不用管如果创建一个符合Activity要求的Intent了,因为给Activity一个crime_id,Activity里已经内部处理好了,返回一个Intent,你直接用就行了。至少Intent怎么实现的,Holder不知道也不关心,它只管给参数得到Intent,然后调用。

对于Activity来讲,只有自己清楚这个crime_id是如何存贮的,因为用也是自己用。使用代码如下:

protected Fragment createFragment() {
UUID crime_id = (UUID)getIntent().getSerializableExtra(EXTRA_CRIME_ID);
return CrimeFragment.newInstance(crime_id);
}

这里因为有父类具体实现FragmentManager如何创建、使用。Activity里只要覆盖createFragment方法即可,这里红色代码部分正是用到了上一步存入Extra的crime_id。

存贮、使用都在Activity内部实现,这样一旦处理方式发生变化,在Activity内部即可完成修正,不影响Holder的调用代码;

相关方法、常量也只在Activity内容使用,不会暴露给Activity以外的区域,保证了安全性。

代码中黄底部分,也是利用同样的方法,Activity不关心Fragment如何使用,你自己决定,我给你传Crime_id,你处理就好。

public static CrimeFragment newInstance(UUID crimeId) {
Bundle args = new Bundle();
args.putSerializable(ARG_CRIME_ID, crimeId);
CrimeFragment fragment = new CrimeFragment();
fragment.setArguments(args);
return fragment;
}

Fragment里使用Bundle来处理参数传递,通过CrimeLib提取Crime

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
UUID crimeId = (UUID) getArguments().getSerializable(ARG_CRIME_ID);
mCrime = CrimeLib.get(getActivity()).getCrime(crimeId);
}

优美的思想,带来优美的代码,希望自己以后在编写程序时,注意解耦合。

……

[android]从书中编码方式,看编程思想的更多相关文章

  1. Java中的泛型 --- Java 编程思想

    前言 ​ 我一直都认为泛型是程序语言设计中一个非常基础,重要的概念,Java 中的泛型到底是怎么样的,为什么会有泛型,泛型怎么发展出来的.通透理解泛型是学好基础里面中非常重要的.于是,我对<Ja ...

  2. vim中编码方式---不完整总结

    关于编码,总有很多故事,这里只是记录下暂时的东西. 1.关于查看文件的编码 在查看文件编码的时候,总是倾向于使用file来进行查看,然而使用file命令的时候,并没有什么卵用: 在查看细节的时候,可以 ...

  3. 参数传递中编码问题(Get/Post 方式)(三)

    自己总结的:     GET方式:      1.提交方式为GET时,数据是放在请求HEADER头中的,且将数据与URL拼接后,浏览器会对拼接后的url进行编码,编码方式为浏览器默认的编码,      ...

  4. asp.net在配置文件里设置多种编码方式的研究

    我们在做asp.net的程序时,在根目录下肯定会有一个web.config的文件, 有点开发经验的可能都知道,它是配置程序的全局信息的地方, 当然了,也可以在这里做更多的事情,下面我们来研究一下 ,如 ...

  5. python中编码问题

    各种编码在内存中所占的大小: ascii: 英文:8bit (1B) uft-: 英文:8bit (1B) 中文:24bit (3B) GBK: 英文:8bit (1B) 中文:16bit (2B) ...

  6. Java编程思想(第4版) 中文清晰PDF完整版

    Java编程思想(第4版) 中文清晰PDF完整版 [日期:2014-08-11] 来源:Linux社区  作者:Linux [字体:大 中 小]     <Java编程思想>这本书赢得了全 ...

  7. c++学习书籍推荐《C++编程思想第二卷》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <C++编程思想>(第2卷)是惟一一本如此清晰地阐述如何重新思考以面向对象方法构造程序的书籍.<C++编程思想>(第2卷)介绍实用的编 ...

  8. Android中使用反应式编程RxJava

    GitHut 地址: https://github.com/ReactiveX/RxAndroid (1)RxJava简介: RxJava 是一个在Java虚拟机上实现的响应式扩展库:提供了基于obs ...

  9. Android 反射-换一种方式编程

    Android 反射-换一种方式编程 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/59109933 本文出自[赵彦军的博客] 上一 ...

随机推荐

  1. python面向对象小tips

    (一).python鸭子类型 python作为动态语言继承和多态与静态语言(像java)有很大的不同:比如说在java中的某个方法,如果传入的参数是Animal类型,那么传入的对象必须是Animal类 ...

  2. webpack中使用ECharts

    npm安装ECharts 引入ECharts 通过 npm 上安装的 ECharts 和 zrender 会放在node_modules目录下.可以直接在项目代码中 require('echarts' ...

  3. 安装VSCODE和typora黑屏

    工欲善其事必先利其器,本来是为了学git为了保存代码,然后网上一顿搜索研究之后发现,用git来保存笔记也不错,因为现在用的onenote搜索实在在在在是太不方便了,除了搜索不行,其他方面她还是很好的, ...

  4. 吴裕雄--天生自然python学习笔记:Python uWSGI 安装配置

    本文主要介绍如何部署简单的 WSGI 应用和常见的 Web 框架. 以 Ubuntu/Debian 为例,先安装依赖包: apt-get install build-essential python- ...

  5. AUTODESK 卸载工具,完美彻底卸载清除干净autodesk各种软件残留注册表和文件

    小伙伴是不是遇到 CAD/3dmax/maya/Revit/Inventor 安装失败或者安装不了的问题了呢?AUTODESK系列软件着实令人头疼,CAD/3dmax/maya/Revit/Inven ...

  6. linux中用户和用户组的概念以及查看命令

    Linux 是多用户多任务操作系统,换句话说,Linux 系统支持多个用户在同一时间内登陆,不同用户可以执行不同的任务,并且互不影响. 例如,某台 Linux 服务器上有 4 个用户,分别是 root ...

  7. 题解:线性规划与网络流24题 T2 太空飞行计划问题

    太空飞行计划问题 问题描述 W教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,-,Em},和进行这些实验需要 ...

  8. mac命令日常总结

    查看某个端口被占用 lsof -i tcp:8080 kill进程: 找到进程的PID,使用kill命令:kill -9 716(PID) date 显示系统日期 mkdir xx 创建xx目录 rm ...

  9. Monkey命令参数介绍

    1) 参数: -p   参数-p用于约束限制,用此参数指定一个或多个包(Package,即App).指定   包之后,Monkey将只允许系统启动指定的APP.如果不指定包,Monkey将允许系统启动 ...

  10. leetCode-nSum

    Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = tar ...