2016-03-01 41 views
1

我想从资源库中获取Observable。我想知道我是否可以使用defer或fromCallable传递可观察值。没有我尝试过的东西没有工作.. 因此,任何人都可以给我一些示例代码,演示如何将延迟或fromCallable传递给observable?rxandroid lambda with retrofit

Retrofit  
@GET("3/discover/movie") 
    Observable<MovieDataContainer> getMovieList2(@Query("sort_by") String sort,@Query("api_key") String api_key,@Query("page") int page); 

库代码

public <T> Observable.Transformer<T, T> applySchedulers() { 
    return observable -> observable.subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()); 
} 
@Override 
    public Observable<MovieDataContainer> getMovieByFilter(String sortBy, String apiKey, int number) { 
     MovieApiService movieApiService=mMovieRetrofit.createService(MovieApiService.class); 
     return movieApiService.getMovieList2(sortBy,apiKey,number).compose(applySchedulers()); 
    } 

在片段我得到可观察到这样(得到取消选中电话警告)

Observable movieObservable = new MovieApiRepository(new MovieRetrofit()).getMovieByFilter("popularity.desc", BuildConfig.MOVIE_DB_API_KEY, 1); 

    movieObservable.subscribe(new Observer<MovieDataContainer>() { 
     @Override 
     public void onCompleted() { 
     } 
     @Override 
     public void onError(Throwable e) { 
     } 
     @Override 
     public void onNext(MovieDataContainer movieDataContainer) { 
      MoviePosterGridAdapter movieAdapter= 
        new MoviePosterGridAdapter(
          getActivity().getApplicationContext(), 
          R.layout.movie_poster_imageview, 
          movieDataContainer.getResults() 
        ); 
      GridView grid = (GridView) getView().findViewById(R.id.movie_grid); 
      grid.setAdapter(movieAdapter); 
     } 
    }); 

我怎样才能缩短使用lambda我的代码? 我已经试过这样的,但它不能识别参数(movieContainer)

movieObservable.subscribe(movieContainer->{ 
     MoviePosterGridAdapter movieAdapter= 
       new MoviePosterGridAdapter(
         getActivity().getApplicationContext(), 
         R.layout.movie_poster_imageview, 
         movieDataContainer.getResults() 
       ); 
     GridView grid = (GridView) getView().findViewById(R.id.movie_grid); 
     grid.setAdapter(movieAdapter); 

}); 

我基本上有3个问题

  1. 我想知道如何观察到的使用推迟或使用retrofit2

  2. fromCallable传递
  3. 我想知道如何使用lambda上订阅

  4. 我是否正确使用rxandroid?

回答

1

1:传递的可观察到通过任何其他对象,可以使用相同的框架作为eventBus或rxbus

2:使用拉姆达这样

movieObservable.subscribe{ movieContainer-> 
     MoviePosterGridAdapter movieAdapter= 
       new MoviePosterGridAdapter(
         getActivity().getApplicationContext(), 
         R.layout.movie_poster_imageview, 
         movieDataContainer.getResults() 
       ); 
     GridView grid = (GridView) getView().findViewById(R.id.movie_grid); 
     grid.setAdapter(movieAdapter); 

    }; 

和结构是:

observable.subscribe{ onNext-> 
    //you code 
}; 


observable.subscribe({ onNext-> 
    //you code 
},{ error -> 
    Log.e(error); 
}); 

observable.subscribe({ onNext-> 
    //you code 
},{ error -> 
    Log.e(error); 
},{ 
    //onComplete.. 
}); 
+0

我目前通过从库中观察到的并在片段中订阅。第二个答案可以解决工作问题......你能告诉我一些适用于改造的演示代码吗? – user3882878

1

lambda表达式是在java8添加和Android作为目前不支持:( 但你可以STIL。 l使用使用retrolambda插件的lambda。

关注这个link入门与retrolambda

和使用推迟RX,你需要做这样的事情

Observable.defer(() -> movieApiService.getMovieList2(sortBy,apiKey,number).compose(applySchedulers()); 

希望这有助于:)

+0

谢谢我尝试完全一样,因为你写了,但我无法订阅它。 – user3882878