Android工程师之ARTS挑战第六期第一周

目标:

  1. 每周至少做一个 leetcode 的算法题
  2. 阅读并点评至少一篇英文技术文章
  3. 学习至少一个技术技巧
  4. 分享一篇有观点和思考的技术文章

第一周:

  • 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)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值