一、感谢
作者【tough1985 】的有关RxJava+Retrofit 实践教程,写的很详细,也非常实用。 其实还应该感谢的有吴长老 的实践例子,但目前对于RxJava用的还不是很深,只能先这样了。
二、添加依赖
compile 'io.reactivex:rxjava:1.2.4'
compile 'io.reactivex:rxandroid:1.2.1'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
这里就要说一下了,前面两个rxjava和rxandroid的版本若是在2.x.x的话,就会引起包冲突,那就有人说了,那可以不要啊,后面说明,至此添加依赖就完了
三、示例代码
public interface MovieService {
@GET ("top250" )
Call<MovieEntity> getTopMovieForCall(@Query ("start" ) int start,
@Query ("count" ) int count);
@GET ("top250" )
Observable<MovieEntity> getTopMovieForObservable(@Query ("start" ) int start,
@Query ("count" ) int count);
}
但就基础来讲的话,初始化MovieService我就直接在MovieService 里面写个内部类了(其实就是懒)
public interface MovieService {
.
.之前的省略了
.
class RetrofitInit{
private static final String BASE_URL = "https://api.douban.com/v2/movie/" ;
public static MovieService init (){
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
MovieService service = retrofit.create(MovieService.class);
return service;
}
}
}
public class MainActivity extends AppCompatActivity implements View .OnClickListener {
private static final String TAG = "MainActivity" ;
private TextView tv;
private Button btn_Call;
@Override
protected void onCreate (Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = ((TextView) findViewById(R.id.result_tv));
btn_Call = ((Button) findViewById(R.id.btn_clickMeForCall));
Button btn_Observable = (Button) findViewById(R.id.btn_clickMeForObservable);
btn_Call.setOnClickListener(this );
btn_Observable.setOnClickListener(this );
}
@Override
public void onClick (View view) {
switch (view.getId()) {
case R.id.btn_clickMeForCall:
getMoviesForCall();
break ;
case R.id.btn_clickMeForObservable:
getMoviesForObservable();
break ;
}
}
/**
* 普通的retrofit的call回调 进行网络请求
*/
private void getMoviesForCall () {
Call<MovieEntity> call = MovieService.RetrofitInit.init().getTopMovieForCall(0 , 10 );
call.enqueue(new Callback<MovieEntity>() {
@Override
public void onResponse (Call<MovieEntity> call, Response<MovieEntity> response) {
tv.setText(response.body().toString());
}
@Override
public void onFailure (Call<MovieEntity> call, Throwable t) {
tv.setText(t.getMessage());
}
});
}
/**
* RxJava 回调
*/
private void getMoviesForObservable () {
Observable<MovieEntity> observable = MovieService.RetrofitInit.init().getTopMovieForObservable(0 , 10 );
observable.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<MovieEntity>() {
@Override
public void onCompleted () {
}
@Override
public void onError (Throwable e) {
tv.setText(e.getMessage());
}
@Override
public void onNext (MovieEntity movieEntity) {
tv.setText(movieEntity.toString());
}
});
}