Day4-3 rxjava+rxandroid+retrofit+okhttp完成网络请求
一.依赖:
implementation 'io.reactivex.rxjava2:rxjava:2.2.6'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
//日志
implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'
//网络请求框架
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
//ConverterFactory的GSON依赖包 GSON插件 网络请求回来自动解析
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
//CallAdapterFactory的Rx依赖包 使用RxJava 线程异常任务调度
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
二.RetrofitManager(单例编写)
public class RetrofitManager {
public static String BASE_URL = "http://www.qubaobei.com/";
private Retrofit retrofit;
private RetrofitManager(){
if (retrofit == null) {
buildRetrofit();
}
}
//单例模式
private static class RetrofitHolder{
private static RetrofitManager retrofitManager = new RetrofitManager();
}
public static RetrofitManager getInstance(){
return RetrofitHolder.retrofitManager;
}
public Retrofit getRetrofit(){
return retrofit;
}
private void buildRetrofit() {
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder()
.readTimeout(60,TimeUnit.SECONDS)
.writeTimeout(60,TimeUnit.SECONDS)
.connectTimeout(60,TimeUnit.SECONDS)
.addInterceptor(loggingInterceptor)
.build();
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
}
}
三.APi接口编写
public interface Api {
//和Rxjava结合
@GET("/ios/cf/dish_list.php?stage_id=1&limit=20&page=1")
Observable<Food> getFoodCall();
}
四.activity调用
public class MainActivity extends AppCompatActivity {
private static final String TAG ="ytx" ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Api api = RetrofitManager.getInstance().getRetrofit().create(Api.class);
Observable<Food> foodCall = api.getFoodCall();
foodCall.subscribeOn(Schedulers.io())//子线程中网络请求数据
.observeOn(AndroidSchedulers.mainThread())//主线程中吐司
.subscribe(new Observer<Food>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Food food) {
Toast.makeText(MainActivity.this, ""+food.getData().size(), Toast.LENGTH_SHORT).show();
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
五.嵌套查询:
1.根据歌手查询歌曲信息
http://musicapi.leanapp.cn/search/suggest?keywords=邓紫棋
2.根据歌曲id查询歌曲mp3地址
http://musicapi.leanapp.cn/music/url?id=1405283464
public interface MusicApi {
@GET("/search/suggest?keywords=邓紫棋")
Observable<Music> getMusic();
@GET("/music/url")
Observable<MusicReslut> getMusicById(@Query("id") String id);
}
public interface MusicApi {
@GET("/search/suggest?keywords=邓紫棋")
Observable<Music> getMusic();
@GET("/music/url")
Observable<MusicReslut> getMusicById(@Query("id") String id);
}
Retrofit retrofit = new Retrofit.Builder()
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.baseUrl("http://musicapi.leanapp.cn/")
.build();
final MusicApi musicApi = retrofit.create(MusicApi.class);
musicApi.getMusic()
.subscribeOn(Schedulers.io())
.flatMap(new Function<Music, Observable<Music.ResultBean.SongsBean>>() {
@Override
public Observable<Music.ResultBean.SongsBean> apply(Music music) throws Exception {
return Observable.fromIterable(music.getResult().getSongs());
}
})
.flatMap(new Function<Music.ResultBean.SongsBean, Observable<MusicReslut>>() {
@Override
public Observable<MusicReslut> apply(Music.ResultBean.SongsBean songsBean) throws Exception {
return musicApi.getMusicById(songsBean.getId()+"");
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<MusicReslut>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(MusicReslut musicReslut) {
String url = musicReslut.getData().get(0).getUrl();
Log.d(TAG, "onNext: "+url);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
六.总结:使用rxjava+retrofit的好处
- 线程调度方便
- 嵌套查询方便