2015-10-14 59 views
0

需要在我的可觀測序列中第二次應用onSubscribe()算子,請參見行:details.add(myApi.getDetails(h.getId()).subscribeOn(Schedulers.io()));。如果未應用onSubscribe()運算符,則會引發NetworkOnMainThreadException爲什麼在我的可觀察序列中需要第二次onSubscribe()調用?

我的理解是,由於我已經在序列的早期應用了subscribeOn(Schedulers.io())算子,所有未來的訂閱應該發生在io調度器上。我的理解有什麼問題?這可能是一個改進的beta2問題,因爲在下面的示例中,myApi實例是通過Retrofit創建的?

myApi.getHeadlines() 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .flatMap(new Func1<Headlines, Observable<HeadlineDetail> { 
     @Override 
     public Observable<HeadlineDetail> call(Headlines headlines) { 
      List<Observable<HeadlineDetail>> details = new ArrayList<>(); 
      for (Headline h : headlines) { 
        details.add(myApi.getDetails(h.getId()).subscribeOn(Schedulers.io())); 
      } 
      return Observable.merge(details); 
     } 
    }) 
    .subscribe(...); 

依賴關係:

  • 改造貝塔2.0-β2
  • 改造rxjava適配器2.0-β2
  • rxjava v1.0.14
  • rxandroind V1.0.1

回答

1

subscribeOn設置observable開始的線程,但是observeOn影響用於下游操作的線程。他們正在「觀察」最初的可觀察物。你從後臺線程開始,但切換到主線程。嘗試將您的observeOn移到更晚的鏈中。

有關更多詳細信息,請參閱observeOn上的文檔。

myApi.getHeadlines() 
    .subscribeOn(Schedulers.io()) 
    .flatMap(new Func1<Headlines, Observable<HeadlineDetail> { 
     @Override 
     public Observable<HeadlineDetail> call(Headlines headlines) { 
      List<Observable<HeadlineDetail>> details = new ArrayList<>(); 
      for (Headline h : headlines) { 
        details.add(myApi.getDetails(h.getId())); 
      } 
      return Observable.merge(details); 
     } 
    }) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(...); 
相關問題