Retrofit 结合rxjava框架用法

来源:互联网 发布:ssh弱算法支持 漏洞 编辑:程序博客网 时间:2024/06/05 17:34

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掉了。

原创粉丝点击