2016-03-01 92 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