Retrofit 结合rxjava框架用法

Retrofit是对okhttp的封装库,通过注解支持restful写法,更简洁,更优雅。
1.引入

 compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'
 compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta2'
 compile 'io.reactivex:rxjava:1.0.14'
 compile 'io.reactivex:rxandroid:1.0.1'

如果需要将返回结果用GSON解析,还需要引入convert库

compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'

2.创建Retrofit对象工具类

public class RetrofitClientUtil {
    private static HashMap<String, Retrofit> retorfitMaps = new HashMap<>();            //根据baseUrl不同,缓存Retrofit对象

    private static Retrofit getRetrofit(String baseUrl) {
        if (!retorfitMaps.containsKey(baseUrl)) {
            OkHttpClient client = new OkHttpClient();
            client.setReadTimeout(30, TimeUnit.SECONDS);
            client.setRetryOnConnectionFailure(true);
            client.setConnectTimeout(20, TimeUnit.SECONDS);//设置超时
            client.setWriteTimeout(30, TimeUnit.SECONDS);

            //client.interceptors().add(new NotEdcodeLoggingInterceptor());//不加密时日志
            client.networkInterceptors().add(new RequestHeaderInterceptor());//请求头
            Retrofit retrofit = new Retrofit
                    .Builder()
//                    .baseUrl(CommunityConstants.SERVER_URI_NEW)
                    .baseUrl(baseUrl)
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
//                    .addConverterFactory(EncryptionGsonConvertrFactory.create())//加密
                    .addConverterFactory(GsonConverterFactory.create())//不加密
                    .client(client)
                    .build();
            retorfitMaps.put(baseUrl,retrofit);
        }

        return retorfitMaps.get(baseUrl);
    }


     public static <T> T createRequest(Class<T> service) {
        Retrofit retrofit = getRetrofit(Constans.SERVER_URI_NEW);
        T instance = retrofit.create(service);

        return (T) requestMaps.get(service);
    }
}

3.网络请求类:
(1)新建网络请求回调接口

public interface HttpBackListener {
    void onSuccess(String requestId, Object object);
    void onException(String requestId,String error);
}

(2)新建网络请求工具类

public class HttpRequestPresenter {
    public Subscription updateUserInfo(String requestId,User user, HttpBackListener listener) {
        UserService userService = HttpClient.createRequest(UserService.class);
        return userService.updateUserInfo(user).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new SubscriberImpl<LockInfoData>(requestId, listener));
    }

    class SubscriberImpl<T> extends Subscriber<T> {
        private HttpBackListener listener;
        private String requestId;

        private SubscriberImpl(String requestId, HttpBackListener listener) {
            this.listener = listener;
            this.requestId = requestId;
        }

        public SubscriberImpl() {
            super();
        }

        @Override
        public void onCompleted() {
        }

        @Override
        public void onError(Throwable e) {
            if (listener != null)
                listener.onException(requestId, e.getMessage());
        }

        @Override
        public void onNext(T t) {
            if (listener != null)
                listener.onSuccess(requestId, t);
        }
    }

}

4.请求服务接口

public interface UserService<T> {
 @POST("userService/updateUserInfo")
    Observable<User> updateUserInfo(@Body User user);
}

5.调用

HttpRequestPresenter  httpPresenter = new HttpRequestPresenter();
 httpPresenter.updateUserInfo("updateUserInfo", user, new HttpBackListener() {
                @Override
                public void onSuccess(String requestId, Object object){
                }
                @Override
                public void onException(String requestId, String error{
                }
            });
  1. 如上框架使用就算完成了,下面讲一下服务接口注解的用法

(1)@path

  /**http://xxx.com/userService/getUser/2/sun*/
 @GET("userService/getUser/{id}/{name}")
    Observable<User> getUser(@Path("id") String id,@Path("name") String name);

(2)@Query

 /**http://xxx.com/userService/getUser?name=sun*/
 @GET("userService/getUser")
    Observable<User> getUser(@Query("name") String name);

(3)@QueryMap (效果同Query)

 @GET("userService/getUser")
    Observable<User> getUser(@QueryMap Map<String, String> map);

还有一种类似的,传
(4)@Multipart

 @POST("userService/uploadFiles")
  @Multipart
    Observable<User> uploadFiles(@Part("name") RequestBody name, @Part("age") RequestBody age, @Part MultipartBody.Part file);

或者

@POST("userService/uploadFiles")
  @Multipart
    Observable<User> uploadFiles(@PartMap Map<String, RequestBody> maps, @Part MultipartBody.Part file);

文件上传代码

 MultipartBody.Part filePart =  MultipartBody.Part.createFormData("file", "test.txt", file);
UserService userService = HttpClient.createRequest(UserService.class);     userService.uploadFiles("name","age",filePart)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SubscriberImpl<LockInfoData>(requestId, listener));

还有Field、FieldMap、Header、Headers、Url等注解,不过以上基本上开发中能碰到的需求都能cover掉了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值