搜尋

首頁  >  問答  >  主體

android - RxJava使用from操作符之后怎么每次发射数据时延迟一段时间

为了使用RxJava实现在ImageView中每隔指定时间加载一张系统图片的效果,

1

2

3

4

5

6

<code>Observable.from(getUri()).timer(2,TimeUnit.SECONDS).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(uri

-> {

            Log.e("uri",uri+"");

            Glide.with(this).load(uri).into(img);});

            

</code>

在getUri()中返回了一个ArrayList<Uri>对象,然后每次发射一个uri到订阅者中,怎么让这个发射过程延迟调用。
使用timer操作符出现了以下错误:Unknown type class java.lang.Long. You must provide a Model of a type for which there is a registered ModelLoader, if you are using a custom model, you must first call Glide#register with a ModelLoaderFactory for your custom model class

高洛峰高洛峰2888 天前513

全部回覆(3)我來回復

  • 天蓬老师

    天蓬老师2017-04-17 18:02:49

    你這個錯誤貌似你Glide引起的,跟Timer沒什麼關係把!

    timer是延時發射函數,只執行一次。想要定時發送數據,試試interval函數:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    <code>Observable.interval(2, TimeUnit.SECONDS)

                      .map(new Func1<Long, String>() {

                          @Override

                          public String call(Long aLong) {

                              return getUrl();

                          }

                      })

                      .subscribe(new Subscriber<String>() {

                          @Override

                          public void onCompleted() {

     

                          }

     

                          @Override

                          public void onError(Throwable e) {

     

                          }

     

                          @Override

                          public void onNext(String o) {

                              Log.d("xxx interval with func", o);

                          }

                      });</code>

    回覆
    0
  • 迷茫

    迷茫2017-04-17 18:02:49

    對於定時任務,必然是從interval開始,不要老是想著從資料開始

    1

    2

    3

    4

    5

    6

    <code>public void loop() {

        final List<String> images = getUri();//图片列表

        Observable.interval(0, 2, TimeUnit.SECONDS)//每2秒执行1次,第一次立即执行

                  .map(i -> images.get(i.intValue() % images.size()))//把循环次数变成图片路径

                  .subscribe(uri -> Glide.with(ctx).load(uri).into(img));//调用Glide

        }</code>

    樓主的錯誤在於,timer是靜態方法,前面的from(getUri())根本沒起到作用,發送出來的不是圖片地址,而是循環次數,類型是Long,丟給Glide後類型出錯。

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-17 18:02:49

    from完在走一個delay即可,具體api如下http://reactivex.io/RxJava/javadoc/rx/Observable.html#delay(rx.functions.Func1)

    回覆
    0
  • 取消回覆