您的位置:首页 > 理论基础 > 计算机网络

rxandroid+okhttp下载并支持https

2017-03-07 13:38 204 查看
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);
}
});
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  rx okhttp