目标:
- 每周至少做一个 leetcode 的算法题
- 阅读并点评至少一篇英文技术文章
- 学习至少一个技术技巧
- 分享一篇有观点和思考的技术文章
第一周:
-
LeetCode 26题
-
class Solution { public int removeDuplicates(int[] nums) { int i = 0; for (int j = 1; j < nums.length; j++) { if (nums[i] != nums[j]) { i++; nums[i] = nums[j]; } } return i + 1; } }
虽然很简单,但是在做题过程中问题:
-
思考的第一想法是真的要去删除数组中的值,引出如果删了数组中的元素怎么做循环?只能添加新的数组
-
快慢指针的写法问题,以前也遇到过数组中前一位和后一位比较的情况都是写在数组里面,如下:
for (int j = 1; j < nums.length; j++) { int i = j+1; if (nums[i] != nums[j]) { i++; nums[i] = nums[j]; } } // 还要处理数组越界的问题
现在发现好傻。
-
-
阅读并点评至少一篇英文技术文章
http://reactivex.io/documentation/operators.html#creating
描述Rxjava中的操作符的使用方法,主要看了有关创建操作符 -
学习至少一个技术技巧:RxJava的操作符
RxJava的冷热之分
Rxjava中什么是热的,什么是冷的?
-
Hot Observable
Hot Observable 意思是如果他开始传输数据,你不主动喊停(
dispose()
/cancel()
),那么他就不会停,一直发射数据,即使他已经没有Subscriber了。而Cold Observable则是subscribe时才会发射数据。 -
cold Observable
那么相反code Observable就是subscribe之后才会发射数据,例如,just()在创建的时候预置了一个值,在subscribe就会发射出去。
Rxjava中使用CompositeDisposable
一般情况我们使用CompositeDisposable就是为了能够主动关闭Disposable,在页面销毁的时候,但是如果我们在CompositeDisposable主动dispose之后想要订阅怎么办?比如,我有个hot Observable不停的发数据,在页面中只是一会接收一会不接收,而且dispose还不是同一个对象,关闭页面之后又要主动dispose。
private val disposables: CompositeDisposable = CompositeDisposable()
fun dispose() {
if (!disposables.isDisposed) {
disposables.dispose()
}
}
观看源码之后,发现这样dispose之后,disposables是不能再添加进去的。
volatile boolean disposed;
@Override
public boolean isDisposed() {
return disposed;
}
@Override
public boolean add(@NonNull Disposable disposable) {
ObjectHelper.requireNonNull(disposable, "disposable is null");
if (!disposed) { // 这里的写法看出来是什么了嘛 -.-
synchronized (this) {
if (!disposed) {
OpenHashSet<Disposable> set = resources;
if (set == null) {
set = new OpenHashSet<Disposable>();
resources = set;
}
set.add(disposable);
return true;
}
}
}
disposable.dispose();
return false;
}
一个线程安全的单例DCL写法,disposed的值在外部又不能设置为false看来只有这样了
fun addDisposable(disposable: Disposable) {
if (disposables.isDisposed)
disposables = CompositeDisposable()
disposables.add(disposable)
}