rxandroid+okhttp下载并支持https

public class DownloadUtils {

    private OkHttpClient httpUtils;  

    public DownloadUtils() {  
        httpUtils = new OkHttpClient();
    }  

    /** 
     * 定义下载方法,使用rx的编程思想 
     * 
     * @param url 
     * @return 
     */  
    public Observable<byte[]> downloadImage(final String url, final RequestBody requestBody) {
        //创建被观察者  
        return Observable.create(new Observable.OnSubscribe<byte[]>() {  
            @Override  
            public void call(final Subscriber<? super byte[]> subscriber) {
                //判断观察者和被观察者是否存在订阅关系  
                if (!subscriber.isUnsubscribed()) {  
                    Request request = new Request.Builder().url(url).post(requestBody).build();

                    if (httpUtils != null) {
                        httpUtils.newCall(request).enqueue(new Callback() {
                            @Override
                            public void onFailure(Call call, IOException e) {
                                subscriber.onError(e);
                            }

                            @Override
                            public void onResponse(Call call, Response response) throws IOException {
                                if (response.isSuccessful()) {
                                    //拿到结果的一瞬间触发事件,并传递数据给观察者
                                    //把请求结果转化成字节数组
                                    byte[] bytes = response.body().bytes();
                                    subscriber.onNext(bytes);
                                }
                                //数据发送已经完成
                                subscriber.onCompleted();
                            }
                        });
                    }
                }  
            }  
        });
    }

    public DownloadUtils addTrustAllSSL(String url) {
        if (url.startsWith("https")) {
            OkHttpClient.Builder builder = new OkHttpClient.Builder().hostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String s, SSLSession sslSession) {
                    return true;
                }
            });

            TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
                @Override
                public void checkClientTrusted(
                        java.security.cert.X509Certificate[] x509Certificates,
                        String s) throws java.security.cert.CertificateException {
                }

                @Override
                public void checkServerTrusted(
                        java.security.cert.X509Certificate[] x509Certificates,
                        String s) throws java.security.cert.CertificateException {
                }

                @Override
                public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                    return new java.security.cert.X509Certificate[] {};
                }
            } };


            try {
                SSLContext sc = SSLContext.getInstance("TLS");
                sc.init(null, trustAllCerts, new java.security.SecureRandom());
                builder.sslSocketFactory(sc.getSocketFactory());
            } catch (Exception e) {
                e.printStackTrace();
            }


            httpUtils = builder.protocols(Collections.singletonList(Protocol.HTTP_1_1)).build();
        }

        return  this;
    }
}  

使用的时候:

@Override
    public void downloadIcon(String url) {
        // 下载图片
        TreeMap<String, Object> parameters = new TreeMap<>();
        parameters.putAll(Constants.getCommonParameters(context));
        parameters.put("fileName", url);
        parameters = Md5Utils.removeEmptyParameters(parameters);


        DownloadUtils downloadUtils = new DownloadUtils();
        RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM)
                .addFormDataPart("v", "1.0")
                .addFormDataPart("appv", String.valueOf(AppUtils.getAppVersionCode(context)))
                .addFormDataPart("p", "Android")
                .addFormDataPart("d", Build.MODEL)
                .addFormDataPart("os", String.valueOf(Build.VERSION.SDK_INT))
                .addFormDataPart("fileName", url)
                .addFormDataPart("sign", Md5Utils.getSign(parameters))
                .build();

        downloadUtils
                .addTrustAllSSL(com.sf.sdk.constants.Constants.BASE_URL)
                .downloadImage(com.sf.sdk.constants.Constants.BASE_URL + "aircap/user/viewPic.shtml", requestBody)
                .subscribeOn(Schedulers.io())//IO操作
                .observeOn(AndroidSchedulers.mainThread())//切换到主线程里面
                .subscribe(new Subscriber<byte[]>() {
                    @Override
                    public void onCompleted() {
                        //主要用于处理加载对话框的显示与隐藏
                    }

                    @Override
                    public void onError(java.lang.Throwable throwable) {

                    }

                    @Override
                    public void onNext(byte[] bytes) {
                        //从服务器端获取的字节数组对象,通过BitmapFactory把字节数组转化成Bitmap对象
                        view.onDownloadIconSuc(bytes);
                    }
                });
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ithouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值