1.添加依賴:
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'io.reactivex.rxjava2:rxjava:2.1.0'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
RxJava與Retrofit一起使用呻征,除了基礎(chǔ)庫之外阀趴,要注意第四個欣除,Retrofit的adapter乏屯,添加完成之后就可以使用了领迈。
2.使用Retrofit
回顧一下Retrofit的使用方法压彭,下面是一個獲取并顯示網(wǎng)絡(luò)圖片的例子:
首先定義訪問接口运翼,這里要獲取的是圖片双谆,需要Stream數(shù)據(jù)壳咕,所以直接使用ResponseBody作為泛型參數(shù):
public interface ConnectService {
@Streaming
@GET("IC.png")
Call<ResponseBody> getImage();
}
然后創(chuàng)建Retrofit對象,訪問網(wǎng)絡(luò)顽馋,獲取ResponseBody并進(jìn)行處理:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://192.168.1.101:8080/")
//必須指定一個converter谓厘,否則報錯,實際上并沒有用到
.addConverterFactory(GsonConverterFactory.create())
.build();
ConnectService cs = retrofit.create(ConnectService.class);
final Call<ResponseBody> imageCall = cs.getImage();
//開始異步訪問
imageCall.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
//從Response獲取inputstream
InputStream inputStream = response.body().byteStream();
final Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
//獲取到圖片寸谜,設(shè)置到imageView
runOnUiThread(new Runnable() {
@Override
public void run() {
mImageView.setImageBitmap(bitmap);
}
});
}
3.與RxJava配合使用
第一步同樣是定義訪問接口竟稳,這里的類型不再是Call,而是被觀察者Observable:
public interface ImageService {
@Streaming
@GET("IC.png")
Observable<ResponseBody> getImg();
}
接下來的步驟也基本一樣程帕,需要注意的是住练,構(gòu)建Retrofit對象時要指定callAdapter:
//構(gòu)建Retrofit
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("192.168.1.101:8080/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
//獲取網(wǎng)絡(luò)訪問接口實例
ImageService is = retrofit.create(ImageService.class);
//構(gòu)建被觀察者Observable
Observable<ResponseBody> observable = is.getImg();
//訂閱。訂閱之后自動執(zhí)行網(wǎng)絡(luò)訪問愁拭。
observable.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<ResponseBody>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull ResponseBody responseBody) {
//獲取ResponseBody并設(shè)置到imageview
mImgView.setImageBitmap(BitmapFactory.decodeStream(responseBody.byteStream()));
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
或者可以采用更簡潔的寫法:
new Retrofit.Builder()
.baseUrl("http://192.168.1.101:8080/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build()
.create(ImageService.class)
.getImg()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<ResponseBody>() {
@Override
public void accept(@NonNull ResponseBody responseBody) throws Exception {
mImgView.setImageBitmap(BitmapFactory.decodeStream(responseBody.byteStream()));
}
});