RxJava+retrofit2实现网络请求

1、新建网络请求返回结果实例(根据自己的实际需要)

public class HttpResult<T> {
    private int code;
    private String message;
    private T result;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public T getResult() {
        return result;
    }

    public void setResult(T result) {
        this.result = result;
    }
}

2、创建网络请求工具类

public class HttpRequestUtils {

    public static final String BASE_URL = "你网络请求地址前缀";

    private static final int DEFAULT_TIMEOUT = 10;

    private Retrofit retrofit;
    private RequestService requestService;

    /**
     * 创建私有构造方法,避免被外部实例化
     */
    private HttpRequestUtils() {
        //手动创建一个OkHttpClient并设置超时时间
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);

        retrofit = new Retrofit.Builder()
                .client(builder.build())
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .baseUrl(BASE_URL)
                .build();

        requestService = retrofit.create(RequestService.class);//网络请求API
    }

    /**
     * 在访问HttpRequestUtils时创建单例对象
     */
    private static class SingletonHolder {
        private static final HttpRequestUtils INSTANCE = new HttpRequestUtils();
    }

    /**
     * 获取单利对象
     * @return
     */
    public static HttpRequestUtils getInstance() {
        return SingletonHolder.INSTANCE;
    }

    /**
     * 获取请求对象
     * @return
     */
    public static RequestService getRequestService(){
        return getInstance().requestService;
    }

    /**
     * 设置观察者
     * @param o 被观察者
     * @param s 观察者
     * @param <T> 数据类型
     */
    public <T> void toSubscribe(Observable<T> o, Subscriber<T> s) {
        o.subscribeOn(Schedulers.io()).unsubscribeOn(Schedulers.io()) //在io线程中处理网络请求
        .observeOn(AndroidSchedulers.mainThread()).subscribe(s);//在主线程中处理数据
    }
}

3、处理请求结果

public class HttpResultFunction<T> implements Func1<HttpResult<T>, T> {
    @Override
    public T call(HttpResult<T> tHttpResult) {
        if (tHttpResult.getCode() == 0) {
            throw new ApiException(ApiException.EXCEPTION_CODE1);//
        }
        return tHttpResult.getResult();
    }
}

4、异常定义

public class ApiException extends RuntimeException {

    public static final int EXCEPTION_CODE1= 100;
    public static final int EXCEPTION_CODE2= 101;

    public ApiException(int resultCode) {
        this(getApiExceptionMessage(resultCode));
    }

    public ApiException(String detailMessage) {
        super(detailMessage);
    }


    private static String getApiExceptionMessage(int code){
        String message = "";
        switch (code) {
            case EXCEPTION_CODE1:
                message = "异常1";
                break;
            case EXCEPTION_CODE2:
                message = "异常2";
                break;
            default:
                message = "网络连接失败";

        }
        return message;
    }
}

5、定义请求API

public interface RequestService<T> {

    @POST("user/loginApi")
    Observable<HttpResult<T>> loginApi(@Field("username") String username, @Field("password") String password, @Field("pushid") String pushid);
}

6、使用调用该登陆方法

public void login( String username, String password,String pushid) {
        Observable observable = HttpRequestUtils.getRequestService().loginApi(username, password,pushid).map(new HttpResultFunction<String>());

        HttpRequestUtils.getInstance().toSubscribe(observable, new Subscriber<String>() {
            @Override
            public void onCompleted() {
                Toast.makeText(OtherActivity.this,"完成",Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onError(Throwable throwable) {
                Toast.makeText(OtherActivity.this,throwable.getMessage(),Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onNext(String s) {
                Toast.makeText(OtherActivity.this,s,Toast.LENGTH_SHORT).show();
            }
        });
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值