xml地图|网站地图|网站标签 [设为首页] [加入收藏]

福特ExplorerxJava学习进度(三):GL450x操作符之:创立操作符

在App中实现一个轮播图已经是很多产品的标配了,很多人都会想到使用ViewPager + Handler来完成轮播图的效果。但是在RxJava快速发展的情况下,已经可以使用RxJava来代替Handler完成这样任务了。如果对RxJava还不熟悉的朋友可以看看以下的一些文章:RxJava学习给 Android 开发者的 RxJava 详解

上篇文章讲的def,create,just都是创建操作符,今天继续学习剩余的创建操作符

RxJava正在Android开发者中变的越来越流行。唯一的问题就是上手不容易,尤其是大部分人之前都是使用命令式编程语言。但是一旦你弄明白了,你就会发现RxJava真是太棒了。

图片 1效果图

Timer

创建一个Observable,它在一个给定的延迟后发射一个特殊的值。
RxJava将这个操作符实现为timer函数。

timer返回一个Observable,它在延迟一段给定的时间后发射一个简单的数字0。

  • timer(long,TimeUnit))
  • timer(long,TimeUnit,Scheduler))

1s后在主线程发射一个数字0.
timerObservable = Observable.timer(1,TimeUnit.SECONDS,AndroidSchedulers.mainThread());//timer默认运行在第三方线程运行,可自己指定运行线程

本人目前也正在学习阶段,立此贴来记录自己学习的历程。下来来讲讲RxJava操作符。

说到ViwePager应该大家都不陌生,它可以结合普通的View也可以结合Fragment一起使用。在此我也就不对它的使用方法进行过多的介绍了。直接开始介绍轮播的方法。

Interval

RxJava将这个操作符实现为interval方法。它接受一个表示时间间隔的参数和一个表示时间单位的参数。

  • Javadoc: interval(long,TimeUnit))
  • Javadoc: interval(long,TimeUnit,Scheduler))

10s后以每隔500ms发射一次数字,从0开始,每次递增1.
itervalObservable = Observable.interval(10, 500, TimeUnit.MILLISECONDS, AndroidSchedulers.mainThread());

操作符

操作符是为了解决对Observable对象的变换的问题,操作符用于在Observable和最终的Subscriber之间修改Observable发出的事件。RxJava提供了很多很有用的操作符。
Subscribers更应该做的事情是“响应”,响应Observable发出的事件,而不是去修改。
所以修改就交给操作符吧.

操作符我按照功能效果进行分类:

private class ImageAdapter extends PagerAdapter{ private ArrayList<ImageView> viewlist; public ImageAdapter(ArrayList<ImageView> viewlist) { this.viewlist = viewlist; } @Override public int getCount() { //设置成最大,使用户看不到边界 return Integer.MAX_VALUE; } ....}

private static class ImageHandler extends Handler{ ... @Override public void handleMessage(Message msg) { super.handleMessage; //检查消息队列并移除未发送的消息,这主要是避免在复杂环境下消息出现重复等问题。 if (activity.handler.hasMessages(MSG_UPDATE_IMAGE)){ activity.handler.removeMessages(MSG_UPDATE_IMAGE); } switch  { case MSG_UPDATE_IMAGE: currentItem++; activity.viewPager.setCurrentItem(currentItem); //准备下次播放 activity.handler.sendEmptyMessageDelayed(MSG_UPDATE_IMAGE, MSG_DELAY); break; case MSG_KEEP_SILENT: //只要不发送消息就暂停了 break; case MSG_BREAK_SILENT: activity.handler.sendEmptyMessageDelayed(MSG_UPDATE_IMAGE, MSG_DELAY); break; case MSG_PAGE_CHANGED: //记录当前的页号,避免播放的时候页面显示不正确。 currentItem = msg.arg1; break; default: break; } } ...}

Range

创建一个发射特定整数序列的Observable
Range操作符发射一个范围内的有序整数序列,你可以指定范围的起始和长度。

RxJava将这个操作符实现为range函数,它接受两个参数,一个是范围的起始值,一个是范围的数据的数目。如果你将第二个参数设为0,将导致Observable不发射任何数据(如果设置为负数,会抛异常)。

range默认不在任何特定的调度器上执行。有一个变体可以通过可选参数指定Scheduler。

  • Javadoc: range(int,int))
  • Javadoc: range(int,int,Scheduler))

发射0,1,2,这3个数字。

rangeObservable = Observable.range(0, 3);

range操作符的subscriber,若不指定,默认运行在主线程。

创建操作符

just( ) — 将一个或多个对象转换成发射这个或这些对象的一个Observable
from( )— 将一个Iterable, 一个Future, 或者一个数组转换成一个Observable
repeat( )— 创建一个重复发射指定数据或数据序列的Observable
repeatWhen( )— 创建一个重复发射指定数据或数据序列的Observable,它依赖于另一个Observable发射的数据
create( )— 使用一个函数从头创建一个Observable
defer( )— 只有当订阅者订阅才创建Observable;为每个订阅创建一个新的Observable
range( )— 创建一个发射指定范围的整数序列的Observable
interval( )— 创建一个按照给定的时间间隔发射整数序列的Observable
timer( )— 创建一个在给定的延时之后发射单个数据的Observable
empty( )— 创建一个什么都不做直接通知完成的Observable
error( )— 创建一个什么都不做直接通知错误的Observable
never( )— 创建一个不发射任何数据的Observable

以上就是比较常见的轮播图的代码,我只是在网上随便找的。首先它的代码中将PagerAdaptergetCount()返回了一个Integer.MAX_VALUE;它的目的是为了让图片一直的播放下去,但是在一些极限情况下还是会crash的,并且它返回的数量太大了在一定程度上对内存也造成了较大的消耗。其次我们可以看到handler的代码极其的冗杂,不仅多而且逻辑也比较麻烦。 现在我们针对刚才的问题来进行优化

Repeat

创建一个发射特定数据重复多次的Observable
RxJava将这个操作符实现为repeat方法。它不是创建一个Observable,而是重复发射原始Observable的数据序列,这个序列或者是无限的,或者通过repeat(n)指定重复次数。

repeat操作符默认在trampoline调度器上执行。有一个变体可以通过可选参数指定Scheduler。

  • repeat()
  • repeat(long)
  • repeat(Scheduler))
  • repeat(long,Scheduler))

将上面的rangeObservable所发射的数据,顺序重复3遍

 repeatObservable = rangeObservable.repeat(3);

可以看出repeat方法不是Observable里面的静态方法,它为其他的observable添加重复属性

变换操作符

map( )— 对序列的每一项都应用一个函数来变换Observable发射的数据序列
flatMap( ), concatMap( ), and flatMapIterable( )— 将Observable发射的数据集合变换为Observables集合,然后将这些Observable发射的数据平坦化的放进一个单独的Observable
switchMap( )— 将Observable发射的数据集合变换为Observables集合,然后只发射这些Observables最近发射的数据
scan( )— 对Observable发射的每一项数据应用一个函数,然后按顺序依次发射每一个值
groupBy( )— 将Observable分拆为Observable集合,将原始Observable发射的数据按Key分组,每一个Observable发射一组不同的数据
buffer( )— 它定期从Observable收集数据到一个集合,然后把这些数据集合打包发射,而不是一次发射一个
window( )— 定期将来自Observable的数据分拆成一些Observable窗口,然后发射这些窗口,而不是每次发射一项
cast( )— 在发射之前强制将Observable发射的所有数据转换为指定类型

更好的无限播放:设置页卡视图列表时,在前后额外各加一个页卡。最前面加最后一张图片,最后面加第1张图片。然后每当切换到最前的页卡时,就替换成倒数第2个页卡;每当切换到最后的页卡时,就替换成第2个页卡。这样一来就形成了连贯,自然实现了无限滑动的功能。1)设置ViewPager的视图列表时,在前后各加一个页卡。

StartWith

若defObservable里面发射“lily”这个字符串,则startWith后变为发射“hellolily”

startWithObserver = defObserveable.startWith(Observable.just("hello"));

过滤操作符

filter( )— 过滤数据
takeLast( )— 只发射最后的N项数据
last( )— 只发射最后的一项数据
lastOrDefault( )— 只发射最后的一项数据,如果Observable为空就发射默认值
takeLastBuffer( )— 将最后的N项数据当做单个数据发射
skip( )— 跳过开始的N项数据
skipLast( )— 跳过最后的N项数据
take( )— 只发射开始的N项数据
first( ) and takeFirst( )— 只发射第一项数据,或者满足某种条件的第一项数据
firstOrDefault( )— 只发射第一项数据,如果Observable为空就发射默认值
elementAt( )— 发射第N项数据
elementAtOrDefault( )— 发射第N项数据,如果Observable数据少于N项就发射默认值
sample( ) or throttleLast( )— 定期发射Observable最近的数据
throttleFirst( )— 定期发射Observable发射的第一项数据
throttleWithTimeout( ) or debounce( )— 只有当Observable在指定的时间后还没有发射数据时,才发射一个数据
timeout( )— 如果在一个指定的时间段后还没发射数据,就发射一个异常
distinct( )— 过滤掉重复数据
distinctUntilChanged( )— 过滤掉连续重复的数据
ofType( )— 只发射指定类型的数据
ignoreElements( )— 丢弃所有的正常数据,只发射错误或完成通知


for (int i = 0; i < count + 2; i++) { if  {// 将最前面一页设置成本来最后的那页 Glide.with. load(imageTitleBeanList.get(count - 1).getImageUrl.into; tvTitle.setText(imageTitleBeanList.get(count - 1).getTitle; } else if (i == count + 1) {// 将最后面一页设置成本来最前的那页 Glide.with. load(imageTitleBeanList.get.getImageUrl.into; tvTitle.setText(imageTitleBeanList.get.getTitle; } else { Glide.with. load(imageTitleBeanList.get.getImageUrl.into; tvTitle.setText(imageTitleBeanList.get.getTitle; } // 将设置好的View添加到View列表中 viewList.add;}

Empty/Never/Throw

Empty

创建一个不发射任何数据但是正常终止的Observable

Never

创建一个不发射数据也不终止的Observable

Throw

创建一个不发射数据以一个错误终止的Observable

这三个操作符生成的Observable行为非常特殊和受限。测试的时候很有用,有时候也用于结合其它的Observables,或者作为其它需要Observable的操作符的参数。

RxJava将这些操作符实现为 empty,never和error。error操作符需要一个Throwable参数,你的Observable会以此终止。这些操作符默认不在任何特定的调度器上执行,但是empty和error有一个可选参数是Scheduler,如果你传递了Scheduler参数,它们会在这个调度器上发送通知。

  • Javadoc: empty())
  • Javadoc: never())
  • Javadoc: error(java.lang.Throwable))

just操作符

创建一个发射指定值的Observable

图片 2

just.png

ust将单个数据转换为发射那个数据的Observable。
Just类似于From,但是From会将数组或Iterable的素具取出然后逐个发射,而Just只是简单的原样发射,将数组或Iterable当做单个数据。
注意:如果你传递null
给Just,它会返回一个发射null
值的Observable。不要误认为它会返回一个空Observable(完全不发射任何数据的Observable),如果需要空Observable你应该使用Empty操作符。
RxJava将这个操作符实现为just
函数,它接受一至九个参数,返回一个按参数列表顺序发射这些数据的Observable。

实例代码:

Observable.just(1, 2, 3)
        .subscribe(new Subscriber<Integer>() {            
@Override            
public void onNext(Integer item) {                
         System.out.println("Next: " + item);            
}            
@Override            
public void onError(Throwable error) {                
          System.err.println("Error: " + error.getMessage());           
 }            
@Override            
public void onCompleted() {                
          System.out.println("Sequence complete.");            
}        
});

输出

Next: 1
Next: 2
Next: 3
Sequence complete.

本文由永利澳门平台发布于计算机资讯,转载请注明出处:福特ExplorerxJava学习进度(三):GL450x操作符之:创立操作符

您可能还会对下面的文章感兴趣: