app研发录第一章笔记

笔记提纲

app研发录第一章.png

1.1,重新规划 Android 项目结构

第一步:建立 AndroidLib 类库,将与业务无关的逻辑转移到 AndroidLib。
  • 1, activity 包中存放的是与业务无关的 Activity 基类。Activity 基类要分两层。
    AndroidLib 下的基类 BaseActivity 封装的是业务无关的公用逻辑,主项目中的 AppBaseActivity 基类封装的是业务相关的公用逻辑。
  • 2, net 包里面存放的是网络底层封装。这里封装的是 AsyncTask。
  • 3, cache 包里面存放的是缓存数据和图片的相关处理。
  • 4, ui 包中存放的是自定义控件。
  • 5, utils 包中存放的是各种与业务无关的公用方法,比如对 SharedPreferences 的封装。
第二步:将主项目中的类分门别类地进行划分,放置在各种包中。

各个包的介绍如下:

  • 1,activity:我们按照模块继续拆分,将不同模块的 Activity 划分到不同的包下。
  • 2,adapter:所有适配器都放在一起。
  • 3,entity:将所有的实体都放在一起。
  • 4,db:SQLLite 相关逻辑的封装。
  • 5,engine:将业务相关的类都放在一起。
  • 6,ui:将自定义控件都放在这个包中。
  • 7,utils:将所有的公用方法都放在这里。
  • 8,interfaces:真正意义上的接口,命名以 I 作为开头。
  • 9,listener:基于 Listener 的接口,命名以 On 作为开头。

这些划分主要是为了以下两个目的
1)每个文件只有一个单独的类,不要有嵌套类,比如在 Activity 中嵌套 Adapter、Entity。
2)将 Activity 按照模块拆分归类后,可以迅速定位具体的一个页面。此外,将开发人员按照模块划分后,每个开发人员都只负责自己的那个包,开发边界线很清晰。

1.2 为 Activity 定义新的生命周期

把onCreate()方法拆分为几个方法:

  • initVariables()
  • initViews()
  • loadData()
    1,initVariables :初始化变量,包括 Intent 带的数据和 Activity 内的变量。
    2,initViews:加载 layout 布局文件,初始化控件,为控件挂上事件方法。
    3,loadData:调用 MobileAPI 获取数据。

这三个方法都是抽象的,所有子类都必须实现这三个方法,这样避免了onCreate方法过于臃肿,做的东西过多,也是单一职责的体现,一个类或方法,只做一件事情。

1.3 统一事件编程模型

给按钮点击事件增加方法,只要在一个团队内部达成了协议,决定使用某种事件编程方式,所有开发人员就要按照同样的方式编写代码。

1.4 实体化编程

1.4.1 在网络请求中使用实体

要知道 JSONObject 和 JSONArray 都是不支持序列化的,所以只好将这种对象封装到一个全局变量中,在跳转前设置,在跳转后取出,这是一种很糟糕的写法。
有以下两个问题:
1)根据 key 值取 value,我们可以认为这是一个字典。同样的功能实现,字典比实体更晦涩难懂,容易产生 bug。
2)每次都要手动从 JSONObject 或者 JSONArray中取值,很烦琐。
建议把网络请求返回的 JSON 数据,通过fastJSON 或者 GSON 解析成javaBean实体。

1.4.2 实体生成器

作者自己写了一个程序,根据json字符串自动产生javabean
在android studio中,可以使用GsonFormat插件将json数据转化为实体bean

1.4.3 在页面跳转中使用实体

很多人在页面跳转传递参数时,设置一个全局变量,在来源页设置全局变量,在目标页接收全局变量。
这是一个很不好的做法,App一旦被切换到后台,当手机内存不足的时候,就会回收这些全局变量,从而当App再次切换回到前台时,再继续使用全局变量,
就会因为他们为空而崩溃。

如果必须使用全局变量,就一定要把它们序列化到本地。这样即使全局变量为空,也能从本地文件中恢复。

建议使用 Intent 在页面间来传递数据实体bean,不过这个实体bean一般需要实现Serializable接口,以支持序列化。

1.5 Adapter 模板

统一规范,要求所有的 Adapter 都继承自 BaseAdapter,从构造函数注入 List< 自定义实体 >这样的数据集合,从而完成 ListView 的填充工作。

如果不对 Adapter 的写法进行规范,开发人员还是会根据自己的习惯,写出来各种各样的 Adapter,比如:
� � 1,很多开发人员都喜欢将 Adapter 内嵌在 Activity 中,一般会使用 SimpleAdapter。
� � 2,由于没有使用实体,所以一般会把一个字典作为构造函数的参数注入到 Adapter 中。
建议:这些写法都会看起来代码不统一,不便于其他人的修改。 Adapter 只有一种编码风格,这样发现了问题也很容易排查。

1.6 类型安全转换函数

类型转换不正确导致的崩溃占了很大的比例。发现主要集中在两个地方:Object 类型的对象、substring 函数。

1)对于一个 Object 类型的对象,我们对其直接使用字符串操作函数 toString,当其为null 时就会崩溃。
比如,我们经常会写出下面这样的程序:
int result = Integer.valueOf(obj.toString());
一旦 obj 这个对象为空,那么上面这行代码会直接崩溃。
这里的 obj,一般是从 JSON 数据中取出来的,对于 MobileAPI 返回的 JSON 数据,我们无法保证其永远不为空。

比较好的做法是,我们需要编写一个类型安全转换函数 convertToInt,实现如下,其核心思想就是,如果转换失败,就返回默认值:

      public f inal static int convertToInt(Object value, int defaultValue) {
          if (value == null || "".equals(value.toString().trim())) {
              return defaultValue;
          }
          try {
              return Integer.valueOf(value.toString());
          } catch (Exception e) {
          try {
                return Double.valueOf(value.toString()).intValue();
          } catch (Exception e1) {
                return defaultValue;
          }
          }
    }

2)如果长度不够,那么执行 substring 函数时,就会崩溃。

Java 的 substring 函数有 2 个参数:start 和 end。
对于第一个参数 start,我们的程序大多是设为 0,所以一般不会有问题。但是要设置为大于 0 的值时,就要仔细思量了,比如:
String cityName = "T";
String f irstLetter = cityName.substring(1, 2);
这样的代码必然崩溃,所以每次在使用 substring 函数的时候,都要判断 start 和 end 两个参数是否越界了。应该这样写:

          String cityName = "T";
          String f irstLetter = "";
          if (cityName.length() > 1) {
              firstLetter = cityName.substring(1, 2);
          }

以上两类问题的根源,都来自 MobileAPI 返回的数据,由此而引出另一个很严肃的问
题,对于从 MobileAPI 返回的数据,可信度到底有多高呢?
首先,不能让 App 直接崩溃,应该在解析 JSON 数据的外面包一层 try…catch…语句,
将截获到的异常在 catch 中进行处理,比如说,发送错误日志给服务器

总结:
1,AndroidLib 这个业务无关的类库,我们将在接下来的章节中封装更多的公用逻辑
2,实体化编程将极大提升代码可读性
3,为 Activity 定义新的生命周期,也是提升代码可读性的一个手段。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356

推荐阅读更多精彩内容