然则在A模块里却找不到,您需求先格式化数据盘并挂载文件系统后才能健康使用数据盘


[](javascript:void(0);)

要领:提取子函数、上移函数到父类、下移函数到子类、封装固定的调用逻辑、使用泛型去除重复逻辑、使用对象制止过多的函数、转移函数、将类型码转为状态格局、NullObject、分解“胖”类型

只要您曾经为 ECS
实例配了数据盘,您必要先格式化数据盘并挂载文件系统后才能不荒谬使用数据盘。

首先是其架构,是按作用模块进行私分的,本来按模块划分也挺好的,不过她却分得太细,总共分为了一7个模块,而有些个模块也就唯有两四个类而已。但接纳本人其实相比简单,要按功效模块来分的话,最多七个模块就够了。

注意

别的,有无数模块划分也很模糊,也有众多类按其成效实在能够属于八个模块的,也有些类定义不明了,做了不应该做的事。有时候,笔者要找四个界面包车型地铁Activity,根据其效劳应该属于A模块的,可是在A模块里却找不到,于是,小编不得不去AndroidManifest文件里找了,找到才察觉原先在B模块里。

  • 磁盘分区和格式化是高风险行为,请慎重操作。本文档描述怎么样处理3个新买的数据盘,假使你的数据盘上有数据,请务必对数据盘创立快速照相以免止大概的数码丢失。

  • 云服务器 ECS 仅支持对 数据盘 举行分区,而不补助对 系统盘
    实行分区。如若您强行使用第二方工具对系统盘进行分区操作,恐怕引发未知危害,如系统崩溃、数据丢失等

也有时候,小编要找另三个界面包车型大巴Activity,可本人看遍了具备模块,也没看到那些界面应该属于哪个模块,不可能,又不得不去AndroidManifest文件里找了,找到才发觉居然在C模块里。代码也是又乱又臭,导致现身一大堆bug又不好找,改好2个bug又出现另三个。整个项目从架构到代码都以又臭又乱,开发职员只是不停地改bug,根本无法做新成效,更别谈扩展了。

正文描述怎么样用3个新的数据盘创建1个单分区数据盘并挂载文件系统。本文仅适用于选择
fdisk 命令对八个不高于 2 TB
的数据盘执行分区操作。要是须求分区的数据盘大于 2 TB,请参考 3贰TB
块存款和储蓄分区

霎时,公司现已有为不一致客户定制化app的供给,而现有的架构完全不大概满足那样的须求。因而,笔者说了算重构,搭建八个易维护、易扩展、可定制的品类。

你还足以依照作业必要,对数据盘实行多分区配置。提议接纳系统自带的工具举行分区操作。

本人将项目分为了八个层级:模型层、接口层、宗旨层、界面层。模型层定义了装有的模型;接口层封装了服务器提供的API;核心层处理全数工作逻辑;界面层就处理界面包车型大巴显得。多少个层级之间的关联如下图所示:

操作须知

单独
购买的数据盘
需要先
挂载数据盘,然后才能格式化。

随实例时一起购买的数据盘,无需挂载,间接格式化。

您须求理解挂载到实例的数据盘的装备名:您可以经过 ECS 管控台 >
磁盘详情 > 磁盘挂载音信 查到数据盘的
设备名。数据盘的装备名由系统私下认可分配,从 /dev/xvdb
起先以后顺序排列,分布范围包涵 /dev/xvdb/dev/xvdz

图片 1

操作步骤

在本示例中,我们用3个新的 20 GB 数据盘(设备名称为/dev/xvdb)创立一个单分区数据盘并挂载1个 ext3 文件系统。使用的实例是
I/O 优化实例,操作系统为 CentOS 6.八。

  1. 远程连接实例

  2. 运行 fdisk -l 命令查看实例是还是不是有数据盘。假诺执行命令后,未有发觉
    /dev/vdb,表示你的实例未有数据盘,无需格式化数据盘,请忽略本文后续内容。

    • 如若您的数据盘显示的是 dev/xvd?,表示你使用的好坏 I/O
      优化实例。

    • 其中 ? 是 a−z 的任三个字母。

  3. 创建二个单分区数据盘,依次执行以下命令:

    1. 运行 fdisk /dev/vdb:对数据盘实行分区。

    2. 输入 n 并按回车键:制造3个新分区。

    3. 输入 p
      并按回车键:采纳主分区。因为创制的是三个单分区数据盘,所以只要求创立主分区。

      说明:假诺要创制 陆个以上的分区,您应该创立至少一个恢弘分区,即采纳 e

    4. 输入分区编号并按回车键。因为此处仅创立三个分区,能够输入 一。

    5. 输入第二个可用的扇区编号:按回车键选取暗中同意值 一。

    6. 输入最终3个扇区编号:因为此处仅成立3个分区,所以按回车键选拔私下认可值。

    7. 输入 wq 并按回车键,开头分区。

      <pre class=”prettyprint linenums prettyprinted”
      style=”box-sizing: border-box; margin: 0px 0px 16px; padding:
      10px; border: 1px solid rgb(221, 221, 221); outline: 0px;
      background-color: rgb(246, 246, 246); font-family: “YaHei
      Consolas Hybrid”, Consolas, “Meiryo UI”, “Malgun Gothic”, “Segoe
      UI”, “Trebuchet MS”, Helvetica, monospace, monospace; overflow:
      auto; font-size: 11.899999618530273px; line-height: 1.6;
      border-top-left-radius: 3px; border-top-right-radius: 3px;
      border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;
      word-wrap: break-word; font-style: normal; font-variant-caps:
      normal; font-weight: normal; font-stretch: normal; white-space:
      pre-wrap; background-position: initial initial;
      background-repeat: initial initial;”>

      1. [root@iXXXXXXX ~]# fdisk /dev/vdb
      2. Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
      3. Building a new DOS disklabel with disk identifier 0x5f46a8a2.
      4. Changes will remain in memory only, until you decide to write them.
      5. After that, of course, the previous content won't be recoverable.
      6. Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
      7. WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
      8. switch off the mode (command 'c') and change display units to
      9. sectors (command 'u').
      10. Command (m for help): n
      11. Command action
      12. e extended
      13. p primary partition (1-4)
      14. p
      15. Partition number (1-4): 1
      16. First cylinder (1-41610, default 1): 1
      17. Last cylinder, +cylinders or +size{K,M,G} (1-41610, default 41610):
      18. Using default value 41610
      19. Command (m for help): wq
      20. The partition table has been altered!
      21. Calling ioctl() to re-read partition table.
      22. Syncing disks.

      </pre>

  4. 查看新的分区:运转命令
    fdisk -l。借使出现以下音信,表达已经打响创设了新分区 /dev/vdb1。

    <pre class=”prettyprint linenums prettyprinted”
    style=”box-sizing: border-box; margin: 0px 0px 16px; padding: 10px;
    border: 1px solid rgb(221, 221, 221); outline: 0px;
    background-color: rgb(246, 246, 246); font-family: “YaHei Consolas
    Hybrid”, Consolas, “Meiryo UI”, “Malgun Gothic”, “Segoe UI”,
    “Trebuchet MS”, Helvetica, monospace, monospace; overflow: auto;
    font-size: 11.899999618530273px; line-height: 1.6;
    border-top-left-radius: 3px; border-top-right-radius: 3px;
    border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;
    word-wrap: break-word; font-style: normal; font-variant-caps:
    normal; font-weight: normal; font-stretch: normal; white-space:
    pre-wrap; background-position: initial initial; background-repeat:
    initial initial;”>

    1. [root@iXXXXXXX ~]# fdisk -l
    2. Disk /dev/vda: 42.9 GB, 42949672960 bytes
    3. 255 heads, 63 sectors/track, 5221 cylinders
    4. Units = cylinders of 16065 * 512 = 8225280 bytes
    5. Sector size (logical/physical): 512 bytes / 512 bytes
    6. I/O size (minimum/optimal): 512 bytes / 512 bytes
    7. Disk identifier: 0x00053156
    8. Device Boot Start End Blocks Id System
    9. /dev/vda1 * 1 5222 41942016 83 Linux
    10. Disk /dev/vdb: 21.5 GB, 21474836480 bytes
    11. 16 heads, 63 sectors/track, 41610 cylinders
    12. Units = cylinders of 1008 * 512 = 516096 bytes
    13. Sector size (logical/physical): 512 bytes / 512 bytes
    14. I/O size (minimum/optimal): 512 bytes / 512 bytes
    15. Disk identifier: 0x5f46a8a2
    16. Device Boot Start End Blocks Id System
    17. /dev/vdb1 1 41610 20971408+ 83 Linux

    </pre>

  5. 在新分区上创设多个文件系统:运维命令 mkfs.ext3 /dev/vdb1

    • 本示例要创设二个 ext三文件系统。您也能够依照自个儿的需求,选取创立其余文件系统,例如,如若要求在
      Linux、Windows 和 Mac 系统里面共享文件,您能够运用 mkfs.vfat
      成立 VFAT 文件系统。

    • 创立文件系统所需时日取决于数据盘大小。

      <pre class=”prettyprint linenums prettyprinted”
      style=”box-sizing: border-box; margin: 0px 0px 16px; padding:
      10px; border: 1px solid rgb(221, 221, 221); outline: 0px;
      background-color: rgb(246, 246, 246); font-family: “YaHei
      Consolas Hybrid”, Consolas, “Meiryo UI”, “Malgun Gothic”, “Segoe
      UI”, “Trebuchet MS”, Helvetica, monospace, monospace; overflow:
      auto; font-size: 11.899999618530273px; line-height: 1.6;
      border-top-left-radius: 3px; border-top-right-radius: 3px;
      border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;
      word-wrap: break-word; font-style: normal; font-variant-caps:
      normal; font-weight: normal; font-stretch: normal; white-space:
      pre-wrap; background-position: initial initial;
      background-repeat: initial initial;”>

      1. [root@iXXXXXXX ~]# mkfs.ext3 /dev/vdb1
      2. mke2fs 1.41.12 (17-May-2010)
      3. Filesystem label=
      4. OS type: Linux
      5. Block size=4096 (log=2)
      6. Fragment size=4096 (log=2)
      7. Stride=0 blocks, Stripe width=0 blocks
      8. 1310720 inodes, 5242852 blocks
      9. 262142 blocks (5.00%) reserved for the super user
      10. First data block=0
      11. Maximum filesystem blocks=4294967296
      12. 160 block groups
      13. 32768 blocks per group, 32768 fragments per group
      14. 8192 inodes per group
      15. Superblock backups stored on blocks:
      16. 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
      17. 4096000
      18. Writing inode tables: done
      19. Creating journal (32768 blocks): done
      20. Writing superblocks and filesystem accounting information: done
      21. This filesystem will be automatically checked every 37 mounts or
      22. 180 days, whichever comes first. Use tune2fs -c or -i to override.

      </pre>

  6. (建议)备份 etc/fstab:运行命令
    cp /etc/fstab /etc/fstab.bak

  7. /etc/fstab 写入新分区消息:运维命令
    echo /dev/vdb1 /mnt ext3 defaults 0 0 >> /etc/fstab

    注意:Ubuntu 12.0四 不援救barrier,所以对该体系科学的吩咐是:echo '/dev/vdb1 /mnt ext3 barrier=0 0 0' >> /etc/fstab

    假诺急需把数据盘单独挂载到有个别文件夹,比如单独用来存放在网页,请将上述命令
    /mnt 替换来所需的挂载点路径。

  8. 查看 /etc/fstab 中的新分区新闻:运转命令 cat /etc/fstab

    <pre class=”prettyprint linenums prettyprinted”
    style=”box-sizing: border-box; margin: 0px 0px 16px; padding: 10px;
    border: 1px solid rgb(221, 221, 221); outline: 0px;
    background-color: rgb(246, 246, 246); font-family: “YaHei Consolas
    Hybrid”, Consolas, “Meiryo UI”, “Malgun Gothic”, “Segoe UI”,
    “Trebuchet MS”, Helvetica, monospace, monospace; overflow: auto;
    font-size: 11.899999618530273px; line-height: 1.6;
    border-top-left-radius: 3px; border-top-right-radius: 3px;
    border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;
    word-wrap: break-word; font-style: normal; font-variant-caps:
    normal; font-weight: normal; font-stretch: normal; white-space:
    pre-wrap; background-position: initial initial; background-repeat:
    initial initial;”>

    1. [root@iXXXXXXX ~]# cat /etc/fstab
    2. #
    3. # /etc/fstab
    4. # Created by anaconda on Thu Feb 23 07:28:22 2017
    5. #
    6. # Accessible filesystems, by reference, are maintained under '/dev/disk'
    7. # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    8. #
    9. UUID=3d083579-f5d9-4df5-9347-8d27925805d4 / ext4 defaults 1 1
    10. tmpfs /dev/shm tmpfs defaults 0 0
    11. devpts /dev/pts devpts gid=5,mode=620 0 0
    12. sysfs /sys sysfs defaults 0 0
    13. proc /proc proc defaults 0 0
    14. /dev/vdb1 /mnt ext3 defaults 0 0

    </pre>

  9. 挂载文件系统:运转命令 mount /dev/vdb1 /mnt

  10. 查阅近来磁盘空间和应用状态:运维命令
    df -h。要是出现新建文件系统的音讯,表达挂载成功,能够行使新的文件系统了。

挂载操作完成后,不需要重启实例即可开始使用新的文件系统。

<pre class="prettyprint linenums prettyprinted" style="box-sizing: border-box; margin: 0px 0px 16px; padding: 10px; border: 1px solid rgb(221, 221, 221); outline: 0px; background-color: rgb(246, 246, 246); font-family: &quot;YaHei Consolas Hybrid&quot;, Consolas, &quot;Meiryo UI&quot;, &quot;Malgun Gothic&quot;, &quot;Segoe UI&quot;, &quot;Trebuchet MS&quot;, Helvetica, monospace, monospace; overflow: auto; font-size: 11.899999618530273px; line-height: 1.6; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; font-style: normal; font-variant-caps: normal; font-weight: normal; font-stretch: normal; white-space: pre-wrap; background-position: initial initial; background-repeat: initial initial;">

1.  `[root@iXXXXXXX ~]# mount /dev/vdb1 /mnt`
2.  `[root@iXXXXXXX ~]# df -h`
3.  `Filesystem  Size  Used  Avail  Use%  Mounted on`
4.  `/dev/vda1 40G  6.6G  31G  18%  /`
5.  `tmpfs 499M  0  499M  0%  /dev/shm`
6.  `/dev/vdb1 20G  173M  19G  1%  /mnt`

</pre>

image

上边展开表明实际的各样层次:

接口层

接口层封装了互连网底层的API,并提须要主旨层调用。刚发轫,为了简单,该层的主干类作者只定义了多少个:

  1. PostEngine,请求引擎类,对请求的殡葬和响应结果举行处理;
  2. Response,响应类,封装了Http请求再次来到的数据结构;
  3. Api,接口类,定义了具备接口方法;
  4. ApiImpl,接口完结类,完结所有接口方法。

PostEngine将呼吁封装好发送到服务器,并对响应结果的json数据转载为Response对象回来。Response其实就是响应结果的json数据实体类,json数据是有定位结构的,分为三类,如下:

<textarea wrap=”soft” class=”crayon-plain print-no”
data-settings=”dblclick” readonly=”” style=”border: none; outline: none;
font-style: normal; font-variant-caps: normal; font-weight: normal;
font-stretch: normal; font-size: 13px !important; line-height: 15px
!important; font-family: Monaco, MonacoRegular, “Courier New”, monospace
!important; display: block; -webkit-appearance: none; padding: 0px 5px;
width: 608px; height: 79.5px; resize: none; overflow: auto; margin: 0px;
position: absolute; opacity: 0; box-sizing: border-box; box-shadow:
none; border-top-left-radius: 0px; border-top-right-radius: 0px;
border-bottom-right-radius: 0px; border-bottom-left-radius: 0px;
-webkit-box-shadow: none; white-space: pre; word-wrap: normal; color:
rgb(0, 0, 0); background-color: rgb(255, 255, 255); tab-size: 4;
z-index: 0; background-position: initial initial; background-repeat:
initial initial;”></textarea>

|

1

2

3

|

{“event”: “0”, “msg”: “success”}

{“event”: “0”, “msg”: “success”, “obj”:{…}}

{“event”: “0”, “msg”: “success”, “objList”:[{…}, {…}],
“currentPage”: 1, “pageSize”: 20, “maxCount”: 2, “maxPage”: 1}

|

event为再次回到码,0意味成功,msg则是回去的音信,obj是回到的单个数据对象,objList是回到的数目对象数组,currentPage表示当前页,pageSize则意味着当前页最多指标数量,maxCount表示对象数据总量,maxPage表示总共有多少页。依照此布局,Response基本的定义如下:

<textarea wrap=”soft” class=”crayon-plain print-no”
data-settings=”dblclick” readonly=”” style=”border: none; outline: none;
font-style: normal; font-variant-caps: normal; font-weight: normal;
font-stretch: normal; font-size: 13px !important; line-height: 15px
!important; font-family: Monaco, MonacoRegular, “Courier New”, monospace
!important; display: block; -webkit-appearance: none; padding: 0px 5px;
width: 608px; height: 223.5px; resize: none; overflow: auto; margin:
0px; position: absolute; opacity: 0; box-sizing: border-box; box-shadow:
none; border-top-left-radius: 0px; border-top-right-radius: 0px;
border-bottom-right-radius: 0px; border-bottom-left-radius: 0px;
-webkit-box-shadow: none; white-space: pre; word-wrap: normal; color:
rgb(0, 0, 0); background-color: rgb(255, 255, 255); tab-size: 4;
z-index: 0; background-position: initial initial; background-repeat:
initial initial;”></textarea>

|

1

2

3

4

5

6

7

8

9

10

11

12

13

|

public class ResponseT> {

private  String  event;

private  String  msg;

private  T  obj;

private  T  objList;

private  int  currentPage;

private  int  pageSize;

private  int  maxCount;

private  int  maxPage;

//getter和setter方法

...    

}

|

每一个属性名称都要与json数据对应的称呼相平等,不然不可能转正。obj和objList用泛型则能够转化为相应的现实指标了。

Api接口类定义了具备的接口方法,方法定义类似如下:

<textarea wrap=”soft” class=”crayon-plain print-no”
data-settings=”dblclick” readonly=”” style=”border: none; outline: none;
font-style: normal; font-variant-caps: normal; font-weight: normal;
font-stretch: normal; font-size: 13px !important; line-height: 15px
!important; font-family: Monaco, MonacoRegular, “Courier New”, monospace
!important; display: block; -webkit-appearance: none; padding: 0px 5px;
width: 608px; height: 79.5px; resize: none; overflow: auto; margin: 0px;
position: absolute; opacity: 0; box-sizing: border-box; box-shadow:
none; border-top-left-radius: 0px; border-top-right-radius: 0px;
border-bottom-right-radius: 0px; border-bottom-left-radius: 0px;
-webkit-box-shadow: none; white-space: pre; word-wrap: normal; color:
rgb(0, 0, 0); background-color: rgb(255, 255, 255); tab-size: 4;
z-index: 0; background-position: initial initial; background-repeat:
initial initial;”></textarea>

|

1

2

3

|

public ResponseVoid> login(String loginName, String password);

public ResponseVersionInfo> getLastVersion();

public ResponseListCoupon>> listNewCoupon(int currentPage, int
pageSize);

|

ApiImpl则完成全数Api接口了,实现代码类似如下:

<textarea wrap=”soft” class=”crayon-plain print-no”
data-settings=”dblclick” readonly=”” style=”border: none; outline: none;
font-style: normal; font-variant-caps: normal; font-weight: normal;
font-stretch: normal; font-size: 13px !important; line-height: 15px
!important; font-family: Monaco, MonacoRegular, “Courier New”, monospace
!important; display: block; -webkit-appearance: none; padding: 0px 5px;
width: 608px; height: 229.5px; resize: none; overflow: auto; margin:
0px; position: absolute; opacity: 0; box-sizing: border-box; box-shadow:
none; border-top-left-radius: 0px; border-top-right-radius: 0px;
border-bottom-right-radius: 0px; border-bottom-left-radius: 0px;
-webkit-box-shadow: none; white-space: pre; word-wrap: normal; color:
rgb(0, 0, 0); background-color: rgb(255, 255, 255); tab-size: 4;
z-index: 0; background-position: initial initial; background-repeat:
initial initial;”></textarea>

|

1

2

3

4

5

6

7

8

9

10

11

12

13

|

@Override

public ResponseVoid> login(String loginName, String password) {

try  {

    String  method  =  Api.LOGIN;

    ListNameValuePair>  params  =  new  ArrayListNameValuePair>();

    params.add(new  BasicNameValuePair("loginName",  loginName));

    params.add(new  BasicNameValuePair("password",  EncryptUtil.makeMD5(password)));

    TypeTokenResponseVoid>>  typeToken  =  new  TypeTokenResponseVoid>>(){};

    return  postEngine.specialHandle(method,  params,  typeToken);

}  catch  (Exception  e)  {

    //异常处理

}

}

|

得以实现大校请求参数和重回的类型定义好,调用PostEngine对象开始展览处理。
接口层的主导基本上就是这一个了。

核心层

主旨层介于接口层和界面层之间,紧要处理工科作逻辑,集中做多少处理。向上,给界面层提供数据处理的接口,称为Action;向下,调用接口层向服务器请求数据。向上的Action中定义的办法类似如下:

<textarea wrap=”soft” class=”crayon-plain print-no”
data-settings=”dblclick” readonly=”” style=”border: none; outline: none;
font-style: normal; font-variant-caps: normal; font-weight: normal;
font-stretch: normal; font-size: 13px !important; line-height: 15px
!important; font-family: Monaco, MonacoRegular, “Courier New”, monospace
!important; display: block; -webkit-appearance: none; padding: 0px 5px;
width: 608px; height: 49.5px; resize: none; overflow: auto; margin: 0px;
position: absolute; opacity: 0; box-sizing: border-box; box-shadow:
none; border-top-left-radius: 0px; border-top-right-radius: 0px;
border-bottom-right-radius: 0px; border-bottom-left-radius: 0px;
-webkit-box-shadow: none; white-space: pre; word-wrap: normal; color:
rgb(0, 0, 0); background-color: rgb(255, 255, 255); tab-size: 4;
z-index: 0; background-position: initial initial; background-repeat:
initial initial;”></textarea>

|

1

|

public void getCustomer(String loginName, CallbackListenerCustomer>
callbackListener);

|

那是1个获得用户音信的格局,因为急需向接口层请求服务器Api数据,所以添加了callback监听器,在callback里对回到的多寡结果开始展览操作。CallbackListener就定义了贰个得逞和二个败诉的点子,代码如下:

<textarea wrap=”soft” class=”crayon-plain print-no”
data-settings=”dblclick” readonly=”” style=”border: none; outline: none;
font-style: normal; font-variant-caps: normal; font-weight: normal;
font-stretch: normal; font-size: 13px !important; line-height: 15px
!important; font-family: Monaco, MonacoRegular, “Courier New”, monospace
!important; display: block; -webkit-appearance: none; padding: 0px 5px;
width: 608px; height: 238.5px; resize: none; overflow: auto; margin:
0px; position: absolute; opacity: 0; box-sizing: border-box; box-shadow:
none; border-top-left-radius: 0px; border-top-right-radius: 0px;
border-bottom-right-radius: 0px; border-bottom-left-radius: 0px;
-webkit-box-shadow: none; white-space: pre; word-wrap: normal; color:
rgb(0, 0, 0); background-color: rgb(255, 255, 255); tab-size: 4;
z-index: 0; background-position: initial initial; background-repeat:
initial initial;”></textarea>

|

1

2

3

4

5

6

7

8

9

10

11

12

13

14

|

public interface CallbackListenerT> {

/**

 * 请求的响应结果为成功时调用

 * @param data  返回的数据

 */

public  void  onSuccess(T  data);

/**

 * 请求的响应结果为失败时调用

 * @param errorEvent 错误码

 * @param message    错误信息

 */

public  void  onFailure(String  errorEvent,  String  message);

}

|

接口的达成基本分为两步:

  1. 参数检查,检查参数的合法性,包含非空检查、边界检查、有效性检查等;
  2. 运用异步职责调用接口层的Api,重返响应结果。

急需注意的是,Action是面向界面的,界面上的多寡可能需求依照区别情况调用分歧的Api。
接轨扩张能够在此处丰裕缓存,但也要视差异情形而定,比如有个别变化太快的多寡,添加缓存就不太符合了。

界面层

界面层处于最上层,其主导便是担当界面包车型客车显示。

因为商户有为差异专营商定制区别app的需要,因而,这里就需求建立八个app的界面,那是1个很麻烦的政工,幸而,Android
Studio提供了很方便的法子能够大大减弱工作量,首要通过安装Gradle,区别app能够添加差异的productFlavors。

界面层package的定义本身也并不遵守旧版的功用模块划分,而基于分歧品类划分,首要分为以下多少个包:

图片 2

image

在这之中,activity、adapter、fragment各自都有三个基类,做联合的处理,比如定义了1些共用的常量、对象和措施等。

界面层是最复杂,最简单变得混乱不堪,最简单出标题标层级。所以,从架构到代码,很多东西都亟待统一筹划好,以及规范好,才能保险程序易维护、易扩大。后续的稿子里将会详细分享下本人在那地方的经历。

模型层

模型层横跨全体层级,封装了颇具数据实体类,基本上也是跟json的obj数据1致的,在接口层会将obj转化为相应的实体类,再通过Action传到界面层。其余,模型层还定义了1部分常量,比如用户情状、支付景况等。在Api里重临的是用壹、二、3如此定义的,而小编则用枚举类定义了那一个情形。用枚举类定义,就能够幸免了界线的检讨,同时也更明了,什么人会记得那么多1、贰、三都代表怎样动静吧。然则用枚举类定义的话,就务须能将1、二、三转会为相应的枚举常量。那里,作者提供三种实现方式:

  1. 运用gson的@SerializedName标签,比如0为FALSE,1为TRUE,则足以如下概念:

<textarea wrap=”soft” class=”crayon-plain print-no”
data-settings=”dblclick” readonly=”” style=”border: none; outline: none;
font-style: normal; font-variant-caps: normal; font-weight: normal;
font-stretch: normal; font-size: 13px !important; line-height: 15px
!important; font-family: Monaco, MonacoRegular, “Courier New”, monospace
!important; display: block; -webkit-appearance: none; padding: 0px 5px;
width: 608px; height: 118.5px; resize: none; overflow: auto; margin:
0px; position: absolute; opacity: 0; box-sizing: border-box; box-shadow:
none; border-top-left-radius: 0px; border-top-right-radius: 0px;
border-bottom-right-radius: 0px; border-bottom-left-radius: 0px;
-webkit-box-shadow: none; white-space: pre; word-wrap: normal; color:
rgb(0, 0, 0); background-color: rgb(255, 255, 255); tab-size: 4;
z-index: 0; background-position: initial initial; background-repeat:
initial initial;”></textarea>

|

1

2

3

4

5

6

|

public enum BooleanType {

@SerializedName("0")

FALSE,

@SerializedName("1")

TRUE

}

|

  1. 经过定义二个value,如下:

<textarea wrap=”soft” class=”crayon-plain print-no”
data-settings=”dblclick” readonly=”” style=”border: none; outline: none;
font-style: normal; font-variant-caps: normal; font-weight: normal;
font-stretch: normal; font-size: 13px !important; line-height: 15px
!important; font-family: Monaco, MonacoRegular, “Courier New”, monospace
!important; display: block; -webkit-appearance: none; padding: 0px 5px;
width: 608px; height: 238.5px; resize: none; overflow: auto; margin:
0px; position: absolute; opacity: 0; box-sizing: border-box; box-shadow:
none; border-top-left-radius: 0px; border-top-right-radius: 0px;
border-bottom-right-radius: 0px; border-bottom-left-radius: 0px;
-webkit-box-shadow: none; white-space: pre; word-wrap: normal; color:
rgb(0, 0, 0); background-color: rgb(255, 255, 255); tab-size: 4;
z-index: 0; background-position: initial initial; background-repeat:
initial initial;”></textarea>

|

1

2

3

4

5

6

7

8

9

10

11

12

13

14

|

public enum BooleanType {

FALSE("0"),

TRUE("1");

private  String  value;

BooleanType(String  value)  {

    this.value  =  value;

}

public  String  getValue()  {

    return  value;

}

}

|

通过gson的方法,直接待上访问TRUE或FALSE就会自行类别化为一或0;假设通过第二种形式,因为未有体系化,则须求通过getValue情势获取一或0。

http://android.jobbole.com/82076/

相关文章

网站地图xml地图