android动画
- 平移动画
TranslateAnimation animation=new TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
fromXDelta 起点x
fromYDelta 起点y
toXDelta 终点x
toYDelta 终点y
以控件的中心为原点坐标,起点终点都是在原点坐标为基准
animation.setDuration(2000);
设置动画时间animation.setFillAfter(false);
设置动画结束是否停留显示(false不显示),如果为true,不能通过隐藏控件让他消失rb_anmia.setAnimationListener()
设置动画的监听(onAnimationStart
,onAnimationEnd
,onAnimationRepeat
)view.startAnimation(animation);
启动动画
viewGroup自定义控件
自定义控件的基本使用
- 创建一个控件类继承ViewGroup
- 复写onlayout
- 复写测量onMeasure
1 | public class ArcMenu extends ViewGroup { |
childView.layout(cl, ct, cr, cb)
- 在xml里面引用
1 | <com.xuan.hifusion.customcontrols.ArcMenu |
RxJava之操作符常用场景(3)
定时心跳
场景描述:
- 一个发送数据出口
- 定时循环发送一个数据
- 当需要发送一个数据临时插入一个数据从出口发送
需要用到的操作符
repat
重复发送delay
延时发送just
快速创建被观察者,插入心跳数据mergeDelayError
合并发送,错误延时
流程
主要是创建两个被观察者,一个负责心跳的发送,另外一个负责数据的发送
实现代码
1 | Observable alive=Observable.just(temp_send).delay(4000,TimeUnit.MILLISECONDS).repeat(); //心跳数据(每隔4s重复发一次) |
重复执行某个动作直到成功,或失败,或超时
场景描述:
- 重复执行某个动作
- 成功后中断继续执行操作
- 错误继续执行
- 未响应发出超时错误,并继续执行
- 达到超时次数,终止执行
需要用到的操作符
distinct
过滤timeout
超时发出错误retryWhen
错误重试zipWith
合并(用于统计错误重试次数)delay
延时(用于发送错误后等待一段时间继续发送)
流程
发出动作请求,等待结果,过滤结果。
- 结果为onError立马重新发出动作请求
- 等待指定时间没有结果,发出超时onError然后重新发出动作请求
- 结果为成功结果终止动作请求
- 直到成功为止,或者超过重试的指定次数
实现代码
1 | public Observable<String> xuanSend(final String str){ |
任务流(循环)
场景描述
- 一个动作完成后才执行下一个动作
- 所有动作完成后重复继续执行
需要用到的操作符
concat
连接操作符(只能连接9个,但是可以嵌套)repat
循环
流程
使用flatmap创建一个基本异步任务,用concat实现连接,用reapt实现循环
实现代码
1 | //任务流 |
Algorithm之时空复杂度
时间复杂度
概念: 时间复杂度是用来衡量算法的执行时间上的效果。
计算方式:
1. 找出算法的基本语句
算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体。
eg: i++; //时间复杂度为O(1)
2. 计算语句执行的数量级
只需计算基本语句执行次数的数量级,这就意味着只要保证基本语句执行次数的函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂的系数。这样能够简化算法分析,并且使注意力集中在最重要的一点上:增长率。
eg:
1 | int sum=0; //(一次) |
因为
$\Theta(2n^2 +n+1)=n^2$($\Theta$即:去低阶项,去掉常数项,去掉高阶项的常参得到),所以$T(n)=O(n^2)$。
3. 时间复杂度表示格式
- $O(1)$
- $O(log(n))$
- $O(n)$
- $O(nlog(n))$
- $O(n^2)$
- $O(n^3)$
- $O(2^n)$
- $O(n!)$
- $O(n^n)$
Android service服务
startService()
- 启动的服务处于“启动的”状态,一旦启动,service就在后台运行,即使启动它的应用组件已经被销毁了
- 通常started状态的service执行单任务并且==不返回任何结果==给启动者
bindService()
- 一个绑定的service提供一个允许组件与service交互的接口,可以发送请求、获取返回结果,还可以通过夸进程通信来交互(IPC)。
- ==绑定的service只有当应用组件绑定后才能运行==,多个组件可以绑定一个service,当调用unbind()方法时,这个service就会被销毁了。
注意:==service与activity一样都存在与当前进程的主线程中==,所以,一些阻塞UI的操作,比如耗时操作不能放在service里进行,比如另外开启一个线程来处理诸如网络请求的耗时操作。
IntentService
- IntentService使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent,对于异步的startService请求,IntentService会处理完成一个之后再处理第二个,每一个请求都会在一个单独的worker thread中处理,==不会阻塞应用程序的主线程==
参考
设计模式之单例模式
懒汉式
- 使用时才实例化
- 使用场景:单例使用次数不多、功能复杂,占用内存大、实例化时间长、特定场景、延迟加载。
- ==线程不安全==:多个线程可能会并发调用他的newInstance方法导致多个线程可能会创建多份相同的单例出来。
1
2
3
4
5
6
7
8
9
10
11
12public class Singleton{
private static Singleton instance = null;
private Singleton(){}
public static Singleton newInstance(){
if(null == instance){
instance = new Singleton();
}
return instance;
}
}
懒汉式同步锁
使用同步锁synchronized (Singleton.class)
解决线程不安全问题
1 | public class Singleton { |
双重校验锁
1 | public class Singleton { |
饿汉式
- 简单快速,实例化快
- 使用场景:占用内存较小的、应用启动时加载初始化的
- 线程安全:因为JVM只会加载一次单例类
1
2
3
4
5
6
7
8
9
10public class Singleton{
private static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton newInstance(){
return instance;
}
}
jvm的类加载机制
JVM已经为我们提供了同步控制
- 在static{}区块中初始化的数据
- 访问final字段时
- …..
静态内部类
- 简洁
- 使用场景:
- 线程安全:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16public class Singleton{
//内部类,在装载该内部类时才会去创建单利对象
private static class SingletonHolder{
public static Singleton instance = new Singleton();
}
private Singleton(){}
public static Singleton newInstance(){
return SingletonHolder.instance;
}
public void doSomething(){
//do something
}
}枚举类
- 最简单
- 线程安全:
1
2
3
4
5
6
7
8public enum Singleton{
//定义一个枚举的元素,它就是Singleton的一个实例
instance;
public void doSomething(){
// do something ...
}
}
使用方法
1 | public static void main(String[] args){ |
参考
RxJava之RxBus替代EventBus
参考
创建RxJava.java
1 | public class RxBus { |
使用
1 | RxBus.getDefault().toObservable(String.class).subscribe(new Action1<String>() { |
注意取消订阅
- CompositeSubscription 可以把 Subscription 收集到一起,方便 Activity 销毁时取消订阅,防止内存泄漏。
1
2
3
4
5
6
7
8
9
10
11private CompositeSubscription allSubscription = new CompositeSubscription();
//添加订阅到列表
allSubscription.add(RxBus.getDefault()
.toObserverable(OneEvent.class).subscribe(this::response));
//销毁时删除订阅
@Override
protected void onDestroy() {
super.onDestroy();
if (allSubscription != null && !allSubscription.isUnsubscribed())
allSubscription.unsubscribe();
}