【问题标题】:rxandroid lambda with retrofitrxandroid lambda 与改造
【发布时间】:2016-03-01 03:00:02
【问题描述】:

我正在尝试从存储库中获取 Observable。我想知道是否可以使用 defer 或 fromCallable 传递 observable。我试过的东西都没有用.. 那么谁能给我一些示例代码来演示如何使用 defer 或 fromCallable 传递 observable?

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(取消选中调用警告)

   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. 我想知道如何使用 defer 或 fromCallable 使用 retrofit2 传递 observable

  2. 我想知道如何在订阅时使用 lambda

  3. 我使用 rxandroid 是否正确?

【问题讨论】:

    标签: android rx-java observable rx-android


    【解决方案1】:

    1:传递observable作为任何其他对象传递,可以使用与eventBus或rxbus相同的框架

    2:像这样使用 lambda

        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..
    });
    

    【讨论】:

    • 我目前正在从存储库传递 observable 并订阅片段。而第二个答案确实有效......你能告诉我适用于改造的演示代码吗?
    【解决方案2】:

    在 java8 中添加了 Lambda,Android 目前不支持它:(。 但是你仍然可以通过 retrolambda 插件来使用 lambdas。

    关注link 开始使用 retrolambda

    为了在 rx 中使用 defer,你需要做这样的事情

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

    希望这会有所帮助:)

    【讨论】:

    • 谢谢我试过和你写的完全一样,但我无法订阅它..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    相关资源
    最近更新 更多