Search in sources :

Example 1 with MyInterceptor

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);
        }
    });
}
Also used : MyInterceptor(com.qiyei.sdk.https.server.MyInterceptor) OkHttpClient(okhttp3.OkHttpClient) Field(java.lang.reflect.Field) BufferedInputStream(java.io.BufferedInputStream) Call(retrofit2.Call) BufferedInputStream(java.io.BufferedInputStream) InputStream(java.io.InputStream) HttpResponse(com.qiyei.sdk.https.server.HttpResponse) ProgressResponseBody(com.qiyei.sdk.https.server.ProgressResponseBody) IOException(java.io.IOException) IOException(java.io.IOException) InvocationTargetException(java.lang.reflect.InvocationTargetException) ResponseBody(okhttp3.ResponseBody) ProgressResponseBody(com.qiyei.sdk.https.server.ProgressResponseBody) Retrofit(retrofit2.Retrofit) FileOutputStream(java.io.FileOutputStream) File(java.io.File)

Aggregations

HttpResponse (com.qiyei.sdk.https.server.HttpResponse)1 MyInterceptor (com.qiyei.sdk.https.server.MyInterceptor)1 ProgressResponseBody (com.qiyei.sdk.https.server.ProgressResponseBody)1 BufferedInputStream (java.io.BufferedInputStream)1 File (java.io.File)1 FileOutputStream (java.io.FileOutputStream)1 IOException (java.io.IOException)1 InputStream (java.io.InputStream)1 Field (java.lang.reflect.Field)1 InvocationTargetException (java.lang.reflect.InvocationTargetException)1 OkHttpClient (okhttp3.OkHttpClient)1 ResponseBody (okhttp3.ResponseBody)1 Call (retrofit2.Call)1 Retrofit (retrofit2.Retrofit)1