use of com.qiyei.sdk.https.server.MyInterceptor in project EssayJoke by qiyei2015.
the class RetrofitEngine method enqueueDownloadCall.
@Override
public <T, R> void enqueueDownloadCall(final HttpTask<T> task, final IHttpTransferCallback<R> callback) {
Retrofit retrofit = RetrofitFactory.createRetrofit(task.getRequest().getBaseUrl());
// 获取到OkHttpClient
OkHttpClient client = (OkHttpClient) retrofit.callFactory();
// 找到Interceptor
MyInterceptor interceptor = new MyInterceptor();
interceptor.setProgressResponseBody(new ProgressResponseBody(callback));
client = client.newBuilder().addInterceptor(interceptor).build();
try {
Field callFactoryField = retrofit.getClass().getDeclaredField("callFactory");
if (callFactoryField == null) {
LogManager.i(HTTP.TAG, "callFactoryField is null");
return;
}
callFactoryField.setAccessible(true);
callFactoryField.set(retrofit, client);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
// 获取task要执行的方法的参数
Object params = task.getRequest().getBody();
// 构造Call
Call call = buildCall(retrofit, task, params);
if (call == null) {
return;
}
// 设置task到okHttp拦截器中
setOkHttpInterceptorTag(call, task);
// 将任务加到队列里面
HttpCallManager.getInstance().addCall(task.getTaskId(), call);
call.enqueue(new Callback<R>() {
@Override
public void onResponse(Call<R> call, final Response<R> response) {
// 可以在这里构造ProgressResponseBody来实现进度的监听
final ResponseBody responseBody = (ResponseBody) response.body();
// final ProgressResponseBody responseBody = new ProgressResponseBody((ResponseBody) response.body(),callback);
// new Thread(){
// @Override
// public void run() {
//
// //read the body to file
// BufferedSource source = responseBody.source();
// File outFile = new File(task.getRequest().getFilePath());
// outFile.delete();
// outFile.getParentFile().mkdirs();
// try {
// outFile.createNewFile();
// BufferedSink sink = Okio.buffer(Okio.sink(outFile));
// source.readAll(sink);
// sink.flush();
// source.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
//
// }
// }.start();
new Thread() {
@Override
public void run() {
try {
InputStream is = responseBody.byteStream();
File file = new File(task.getRequest().getFilePath());
// 创建父目录
file.getParentFile().mkdirs();
if (file.exists()) {
file.delete();
}
FileOutputStream fos = new FileOutputStream(file);
BufferedInputStream bis = new BufferedInputStream(is);
byte[] buffer = new byte[1024];
int len;
while ((len = bis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
fos.flush();
}
fos.close();
bis.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
}
mHandler.post(new Runnable() {
@Override
public void run() {
// 移除task
HttpCallManager.getInstance().removeCall(task.getTaskId());
HttpResponse<R> obj = new HttpResponse<>(response.body());
callback.onSuccess(obj);
}
});
}
}.start();
}
@Override
public void onFailure(Call<R> call, Throwable t) {
// 移除task
HttpCallManager.getInstance().removeCall(task.getTaskId());
callback.onFailure((Exception) t);
}
});
}
Aggregations