Retrofit
Gradle引入
//rxjava
compile 'io.reactivex.rxjava2:rxjava:2.1.1'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
//retrofit
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.8.1'
Retrofit注解
HTTP请求方法
- GET
- POST
- PUT
- DELETE
- HEAD
- HTTP(官网上没有见用这个的例子)
标记类
- FormUrlEncoded
- Multipart
参数类
- Path
- Field
- FieldMap
- Part
- PartMap
- Header
- Headers
- Query
- QueryMap
- Url
Retrofit与RxJava
用Retrofit就是为了能和RxJava一块使用,优雅的请求网络。
下面是几个常用注解。
GET、Path
public interface GetCommunityList {
@GET("Forum/get_forum_list/{id}")
Observable<CommunityListBean> getCommunityList(@Path("id") int id);
}
POST、FormUrlEncoded
public interface Post {
@POST("UserAdministration/Administration_posts_menu")
@FormUrlEncoded
Observable<FenQuListBean> getFenQulList(@Field("user_id") String uid,@Field("fid") String fid);
}
Multipart
public interface UpLoadUserBg {
//单张图片上传
@Multipart
@POST("UserCenter/update_back_ground")
Observable<DefultData> updateImage(@Part MultipartBody.Part file);
//多张图片上传
@Multipart
@POST("UserCenter/update_back_ground")
Observable<DefultData> updateImage(@Part MultipartBody.Part[] file, @Part("uid") RequestBody token);
}
使用
简单封装了一下请求。
public class RetrofitServiceManager {
private Retrofit mRetrofit;
private RetrofitServiceManager() {
mRetrofit = new Retrofit.Builder()
.baseUrl("http://baidu.com/app.php/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
}
private static class SingletonHolder{
private static final RetrofitServiceManager INSTANCE = new RetrofitServiceManager();
}
/**
* 获取RetrofitServiceManager
* @return
*/
public static RetrofitServiceManager getInstance(){
return SingletonHolder.INSTANCE;
}
/**
* 获取对应的Service
* @param service Service 的 class
* @param <T>
* @return
*/
public <T> T create(Class<T> service){
return mRetrofit.create(service);
}
}
具体使用
RetrofitServiceManager.getInstance()
.create(GetCommunityList.class)
.getCommunityList()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<CommunityListBean>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull CommunityListBean beanInfo) {
setValues(beanInfo);
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
两个接口同时调用
可以看到使用了merge操作符,将两个请求合并到了一起,在onNext中进行判断处理
Observable.merge(RetrofitServiceManager.getInstance()
.create(GetThemeRecom.class)
.getThemeRecomData(UserId),
RetrofitServiceManager.getInstance()
.create(ThemeCircleList.class)
.getThemeCircleList()).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Object>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull Object obj) {
if (obj instanceof ThemeRecom) {
setValues((ThemeRecom) obj);
}
if (obj instanceof ThemeCircleListBean) {
if (CLEAR_DATA) {
mStrings.clear();
}
mStrings.addAll(((ThemeCircleListBean) obj).getData());
}
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
上传图片
File file1 = new File(mCorpImageMap.get("image"));
File file2 = new File(mCorpImageMap.get("reimage"));
RequestBody requestFile1 = RequestBody.create(MediaType.parse("multipart/form-data"), file1);
RequestBody requestFile2 = RequestBody.create(MediaType.parse("multipart/form-data"), file2);
RequestBody tokenBody = RequestBody.create(MediaType.parse("text/plain"), UserUtils.getUserId());
MultipartBody.Part[] file = new MultipartBody.Part[2];
file[0] = MultipartBody.Part.createFormData("image", file1.getName(), requestFile1);
file[1] = MultipartBody.Part.createFormData("reimage", file2.getName(), requestFile2);
RetrofitServiceManager.getInstance()
.create(UpLoadUserBg.class)
.updateImage(file, tokenBody)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<DefultData>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull DefultData defultData) {
if (defultData.getStatus()==1)
Toast.makeText(UserPageActivity.this, "背景墙修改成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
https://square.github.io/retrofit/