乙巳🐍年

acc8226 的博客

要点:如果不是必须, 用系统控件

RxJava

线程切换需要注意的地方
RxJava 内置的线程调度器的确可以让我们的线程切换得心应手,但其中也有些需要注意的地方。

  • 简单地说,subscribeOn() 指定的就是发射事件的线程,observerOn() 指定的就是订阅者接收事件的线程。
  • 多次指定发射事件的线程只有第一次指定的有效,也就是说多次调用 subscribeOn() 只有第一次的有效,其余的会被忽略。
  • 但多次指定订阅者接收线程是可以的,也就是说每调用一次 observerOn(),下游的线程就会切换一次。

RxJava 中,已经内置了很多线程选项供我们选择,例如有:

  • Schedulers.io() 代表io操作的线程, 通常用于网络,读写文件等 IO 密集型的操作;

  • Schedulers.computation() 代表CPU计算密集型的操作, 例如需要大量计算的操作;

  • Schedulers.newThread() 代表一个常规的新线程;

阅读全文 »

先总结下自定义 View 的步骤:

  1. 自定义 View 的属性
  2. 在 View 的构造方法中获得我们自定义的属性
  3. [重写 onMeasure]
  4. 重写 onDraw

我把 3 用[]标出了,所以说 3 不一定是必须的,当然了大部分情况下还是需要重写的。

  1. 自定义 View 的属性,首先在 res/values/ 下建立一个attrs.xml , 在里面定义我们的属性和声明我们的整个样式。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="utf-8"?>
<resources>

<attr name="titleText" format="string" />
<attr name="titleTextColor" format="color" />
<attr name="titleTextSize" format="dimension" />

<declare-styleable name="CustomTitleView">
<attr name="titleText" />
<attr name="titleTextColor" />
<attr name="titleTextSize" />
</declare-styleable>

</resources>

format是值该属性的取值类型:
string, color, demension, integer, enum, reference, float,boolean, fraction, flag;不清楚的可以 google

自定义View之基础概念之用到的六个工具

  • Configuration

  • ViewConfiguration
    提供了一些自定义控件用到的标准常量, 比如UI超时, 尺寸大小, 滑动距离, 敏感度等等

  • GestureDetector
    简化Touch操作

  • VelocityTracker
    用于跟踪触摸屏事件(比如: Flingling以及其他手势事件)的速率

1
2
3
4
5
6
7
8
9
10
11
mVelocityTracker = VelocityTracker.obtain();
mVelocityTracker.addMovement(MotionEvent event);

// 获取1000毫秒内运行的像素
mVelocityTracker.computeCurrentVeleocity(1000)

// 获取1S内 X 方向上移动的像素
mVelocityTracker.getXVelocity()

// 最后记得释放
mVelocityTracker.recycle()
  • Scroller
    scrollBy() 内部还是调用了scrollTo()
    scrollTo() 和 scrollBy()

mTextView.scrollTo(0, 25)

  • ViewDragHelper
    简化View的拖拽操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ViewDragHelper mViewDragHelper = ViewDragHelper.create(context, 1.0f, new ViewDragHelper.Callback(){
clampViewPositionHorizontal(View child, int left, int dx)
clampViewPositionVertical(View child, int left, int dx)
onViewDragStateChanged(int state){
ViewDragHelper.STATE_DRAGGING:
ViewDragHelper.STATE_IDLE:
ViewDragHelper.STATE_SETTLING:
}
}

然后代理两个方法

```java
public boolean onINterrceptTouchEvent(MotionEvent ev) {
return mViewDragHelper.shouldInterceptTouchEvent(ev);
}

public boolean onTouchEvent(MotionEvent ev) {
mViewDragHelper.processTouchEvent(ev);
return true;
}
1
2
3
4
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);

int measureSpec = MeasureSpec.makeMeasureSpec(size, mode);

四大组件

活动(activity)

android-lifecycle/complete_android_fragment_lifecycle

服务(Service)

最终结果不会影响 UI, 例如将数据缓存到数据库中。

  • Service
  • IntentService
  • 会在后台线程执行 onHandleIntent 方法
  • 按顺序执行, 但一次只能处理一个

广播接受者(Broadcast Receive)

  • 动态注册: 电池电量变化
  • 静态注册: 耗电, 一般不推荐

内容提供者(Content Provider)

参考

Android 四大组件(整理相关知识点)_Calvert 的博客- CSDN 博客_安卓四大组件 https://blog.csdn.net/xchaha/article/details/80398620

(一) 错误码

1.【强制】错误码的制定原则:快速溯源、沟通标准化。
说明:错误码想得过于完美和复杂,就像康熙字典的生僻字一样,用词似乎精准,但是字典不容易随身携带且简单易懂。
正例:错误码回答的问题是谁的错?错在哪?
1)错误码必须能够快速知晓错误来源,可快速判断是谁的问题。
2)错误码必须能够进行清晰地比对(代码中容易 equals)。
3)错误码有利于团队快速对错误原因达到一致认知。

2.【强制】错误码不体现版本号和错误等级信息。
说明:错误码以不断追加的方式进行兼容。错误等级由日志和错误码本身的释义来决定。

3.【强制】全部正常,但不得不填充错误码时返回五个零:00000。

4.【强制】错误码为字符串类型,共 5 位,分成两个部分:错误产生来源 + 四位数字编号。
说明:错误产生来源分为 A/B/C,A 表示错误来源于用户,比如参数错误,用户安装版本过低,用户支付超时等问题;
B 表示错误来源于当前系统,往往是业务逻辑出错,或程序健壮性差等问题;C 表示错误来源于第三方服务,比如 CDN 服务出错,消息投递超时等问题;四位数字编号从 0001 到 9999,大类之间的步长间距预留 100,参考文末附表 3。

阅读全文 »

1. 【强制】前后端交互的 API,需要明确协议、域名、路径、请求方法、请求内容、状态码、响应体。
说明:
1)协议:生产环境必须使用 HTTPS。
2)路径:每一个 API 需对应一个路径,表示 API 具体的请求地址:
 a)代表一种资源,只能为名词,推荐使用复数,不能为动词,请求方法已经表达动作意义。
 b)URL 路径不能使用大写,单词如果需要分隔,统一使用下划线。
 c)路径禁止携带表示请求内容类型的后缀,比如 “.json”,“.xml”,通过 accept 头表达即可。
3)请求方法:对具体操作的定义,常见的请求方法如下:
 a)GET:从服务器取出资源。
 b)POST:在服务器新建一个资源。
 c)PUT:在服务器更新资源。
 d)DELETE:从服务器删除资源。
4)请求内容:URL 带的参数必须无敏感信息或符合安全要求;body 里带参数时必须设置 Content-Type。
5)响应体:响应体 body 可放置多种数据类型,由 Content-Type 头来确定。

2. 【强制】前后端数据列表相关的接口返回,如果为空,则返回空数组[]或空集合{}。
说明:此条约定有利于数据层面上的协作更加高效,减少前端很多琐碎的 null 判断。

阅读全文 »
0%