android中使用LinkedBlockingQueue,实现

2019-07-23  本文已影响0人  则卷滔滔

背景:对于客户端来说经常会有多线程的需求,一般为了线程安全会加锁,或者使用特殊的集合来处理,基本会满足我们的需求。但是有些多线程场景是在特殊环境下,服务端数据源一直发送处理数据到客户端,然后客户端处理逻辑比较复杂属于耗时操作,放在主线程会导致界面卡顿,因此会不断的用子线程来执行,并且对数据处理的执行顺序还必须是先进先出的模式,不然数据可能会出现问题。

需求:

根据需求首先考虑的就是阻塞队列BlockingQueue,经过一番对比选用LinkedBlockingQueue来进行实现。
LinkedBlockingQueue在安卓中的实现和在java中的实现不太一样,考虑到子线程处理主线程显示的逻辑,网上参考了比较多其他的博客,后面才有了下面的处理

1.首先创建LinkedBlockingQueue

private val linkedBlockingQueue = LinkedBlockingQueue<T>()

2.接受服务器push过来的数据,并且保存进LinkedBlockingQueue

linkedBlockingQueue.put(T)

3.在启动类的时候通过rxjava开启子线程获取LinkedBlockingQueue中排队的数据进行处理,处理完成后返回主线程进行操作

init {
        addSubscribe(Flowable.interval(0, 500, TimeUnit.MILLISECONDS)
                .flatMap {
                    //获取的方法poll,如果生产者没有数据,那么这里的消费者拿到的数据是为null,需要做判断
                        var T = linkedBlockingQueue.poll()  
                        Flowable.just(update(T))   //处理逻辑
                }
                .compose(RxUtils.rxSchedulerHelper())//rxjava线程切换
                .subscribe({
                        mView?.showView(data)
                }, {}))
    }


LinkedBlockingQueue的基本方法讲解:

LinkedBlockingQueue构造的时候若没有指定大小,则默认大小为Integer.MAX_VALUE,当然也可以在构造函数的参数中指定大小。LinkedBlockingQueue不接受null。

上一篇 下一篇

猜你喜欢

热点阅读