首页
网站首页
公司简介
资讯中心
推荐内容
返回顶部
了解一下,四大架构的优缺点
发布时间:2020-03-30 20:47
浏览次数:

以前做应用开发时,在数据尚未加载前一般会先给用户一个提示,最简单粗暴的方式就是菊花图,大多数做法是放一张有个性的静态图,示意正在加载数据,这样体验会好些,直到出现 Skeleton Screen(中文一般叫做骨架屏)极大地提升用户感知体验。其实一开始我并不知道这个效果叫什么名字,后来在 GitHub 看到有人开源了,赶紧 Star。今天我给大家推荐几个 Skeleton Screen 相关库,来了解学习一波。

很多人都可能在面试的时候遇到过这样一道题目:

现在使用较多的类似美团、外卖等APP的城市选择界面,一行代码搞定,就是这么简单粗暴!!!

前言

A custom recycler view with shimmer views to indicate that views are loading (英语渣渣,这句话始终翻译不顺/捂脸)。

有 1000 个一模一样的瓶子,其中有 999 瓶是普通的水,其中有一瓶含有剧毒(稀释后仍然具有毒性),你只有 10 条小白鼠,它们在喝下毒药后会马上死去,怎样利用它们在最短的时间内判断出哪瓶是毒药?

Tips:会报高德定位jar包冲突,推荐使用2.x版本。

前不久刚结束对 20 模块项目的第 3 轮重构,一路见证 MVC、MVP、Clean 的优缺点并形成自己的体会。

图片 1image图片 2image

我们都知道,在计算机语言当中,所有的数字最终都会转化为二进制进行计算,而二进制中每一个“位”能够表示两种状态,它们分别是数字 0 和 1。

  • 字母悬浮栏
  • 指定热门城市
  • 自定义动画效果
  • 自定义主题
  • 名称或拼音搜索
  • 返回城市名、code等数据
  • 提供定位接口,解耦定位SDK

近期在总结工作经验的同时,开始写博客。顺便开源了我设计的 ViaBus 架构。

https://github.com/sharish/ShimmerRecyclerView

回到刚才的题目,每条小白鼠的生和死的状态都可以表示二进制中的一个“位”, 10 条小白鼠一共就能表示 1024 种组合状态,因此这道题目一个解决思路就是,给这 1000 瓶水都按照二进制的格式标上记号(10 位二进制数就能标记全部),让这 10 条小白鼠分别对应这十位二进制中的一位,然后将这十位二进制数中当前位上是 1 的水混合在一起给对应此位的小白鼠喝,根据小白鼠的死亡情况就能定位哪瓶水有毒。

图片 3默认图片 4主题图片 5搜索

项目地址: https://github.com/KunMinX/android-viabus-architecture

注‘Android技术交流群878873098,欢迎大家加入交流,畅谈!本群有免费学习资料视频’并且免费分享源码解析视频

这个库提供了一种显示骨架加载视图的简便方法,它现在使用闪存动画的内存优化版本,因此速度更快,您也可以设置更大的布局动画。

从 MeasureSpec 中理解位运算

在 Android 开发中,我们也时常见到位运算的身影。在进行自定义 View 的时候,都会用到 int makeMeasureSpec(int size, int mode) 方法去获取 View 的尺寸和测量模式,那么它是怎么把两个变量组装成一个的呢?简单地讲就是用一个 32 位二进制数字中的高两位来存储测量模式 MeasureMode,用低 30 位来存储尺寸 MeasureSize,MeasureSpec 是 android.view.View 类中的一个内部类,关键代码如下:

public static class MeasureSpec { private static final int MODE_SHIFT = 30; //SpecMode 掩码,用于屏蔽高两位 //11 000000 00000000 00000000 00000000 private static final int MODE_MASK = 0x3 << MODE_SHIFT; //00 000000 00000000 00000000 00000000 public static final int UNSPECIFIED = 0 << MODE_SHIFT; //01 000000 00000000 00000000 00000000 public static final int EXACTLY = 1 << MODE_SHIFT; //10 000000 00000000 00000000 00000000 public static final int AT_MOST = 2 << MODE_SHIFT; //获取 MeasureSpec public static int makeMeasureSpec(int size, int mode) { // API 17 之前,忽略此条件 if (sUseBrokenMakeMeasureSpec) { return size + mode; } else { return (size & ~MODE_MASK) | (mode & MODE_MASK); } } //获取 SpecMode public static int getMode(int measureSpec) { return (measureSpec & MODE_MASK); } //获取 SpecSize public static int getSize(int measureSpec) { return (measureSpec & ~MODE_MASK); }}

位运算的操作符有以下几种:

  1. 或运算符| :0|0=0,0|1=1,1|1=1

  2. 与运算符& :0&0=0,0&1=0,1&1=1

  3. 非运算符~ : ~0=1,~1=0

  4. 异或运算符^ : 相同为 0,不同为 1:0^0=0,1^0=1,0^1=1,1^1=0

  5. 右移运算符 >> 和左移运算符 << :001<<2=100,110>>1=11

在 MeasureSpec 类中,getMode 方法是将参数 measureSpec 与 MODE_MASK 进行与运算,MODE_MASK 可以理解为 SpecMode 的掩码,运算的结果是保留measureSpec 的高两位,剩下的后 30 位置 0,得到的是 MeasureMode。

getSize 方法是先将 MODE_MASK 取反再跟 measureSpec 进行与运算,结果是高两位为 0 低 30 位不变的值,即 SpecSize。

makeMeasureSpec 方法中,size & ~MODE_MASK 的结果是 size 的 SpecSize,mode & MODE_MASK 的结果是 SpecMode,将他们进行或操作,得到的就是是两者的叠加值。

下载demo.apk体验.

项目常用架构比对

图片 6image图片 7image

位运算在实际开发中的使用

类似的,在日常开发中,我们也可以用位运算来简化一些操作,假如服务端返回一个数字,可能存在几种状态叠加的情况,如果按照传统的方法来处理将会很麻烦,这时候就需要利用位运算了。

图片 8status.png

我们可以新建一个 StatusManager 类用来处理这个复杂的状态:

public class StatusManager { // 正常 public static final int STATUS_NORMAL = 0 ; // 0000 //时间同步失败 public static final int STATUS_TIME_ASY = 1 ; // 0001 // 开门指令失败 public static final int STATUS_OPEN_DOOR = 1 << 1; // 0010 // 添加固定密码失败 public static final int STATUS_ADD_FIXED_PSW = 1 << 2; // 0100 // 删除固定密码失败 public static final int STATUS_DEL_FIXED_PSW = 1 << 3; // 1000 // 存储目前的权限状态 private int flag; /** * 重置状态 */ public void setStatus(int status) { flag = status; } /** * 添加一种或者多种状态 */ public void addStatus(int status) { flag |= status; } /** * 删除一种或者多种状态 */ public void deleteStatus(int status) { flag &= ~status; } /** * 是否具有某些状态 */ public boolean hasStatus(int status) { return (flag & status) == status; } /** * 是否不具有某些状态 */ public boolean isHasnotStatus(int status) { return (flag & status) == 0; } /** * 是否仅仅具有某些状态 */ public boolean isOnlyHas(int status) { return flag == status; }}

添加状态时,可以这样写:

manager.addStatus(StatusManager.STATUS_TIME_ASY | STATUS_ADD_FIXED_PSW )

如果需要判断是否时间同步和开门指令同时失败,可以这样写:

manager.hasStatus(StatusManager.STATUS_TIME_ASY | STATUS_OPEN_DOOR)

library已上传 Jitpack,需要在root build.gradle里添加如下代码:

以下,对常见的 MVC、MVP、Clean、AAC 架构做个比对。

https://github.com/ethanhua/Skeleton

allprojects { repositories { ... maven { url 'https://jitpack.io' } }}

首先,一张表格展示各架构的类冗余情况:

Spruce 是一个轻量级动画库,可帮助编排屏幕上的动画。该库同时支持 iOS。

add dependency:

需求是,写三个页面,ListFragment、DetailFragment、PreviewFragment,每个页面至少用到 3个 Note 业务、3个 User 业务。问:上述架构分别需编写多少类?

图片 9image

dependencies { implementation 'com.github.zaaach:CityPicker:2.0.3' //必选 implementation 'com.android.support:recyclerview-v7:27.1.1' //必选}

图片 10image

https://github.com/willowtreeapps/spruce-android

or Maven:

MVC 架构的缺陷

友情链接: 网站地图
Copyright © 2015-2019 http://www.nflfreepicks.net. 新葡萄京娱乐场网址有限公司 版权所有