【问题标题】:Retrofit call back time remain download file Android改造回调时间保留下载文件Android
【发布时间】:2016-08-19 16:01:46
【问题描述】:

我正在我的应用中实施改造。我使用下面的代码来获取字符串并从服务器写入文件。

Callback callback = new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
            Log.i(TAG, "onResponse");
            File file = new File(fileDirectory);
            file.mkdirs();
            File outputFile = new File(file,
                    XXX);
            try {
                OutputStreamWriter osw = new OutputStreamWriter(
                        new FileOutputStream(outputFile));
                osw.write(new String(response.body().string()));
                osw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {
            Log.i(TAG,"onFailure, getTermAndPoliciesDocument()");
            t.printStackTrace();
        }
    };
    PortalService portalService = ServiceGeneratorDemo.createService(PortalService.class);
    Call<ResponseBody> call = portalService.getStringFromFile(AppSetting.Default.TERM_AND_POLICIES_DOC_NAME);
    call.enqueue(callback);

现在我想显示有关该文件下载的信息。像 1 - 100% 一样完成进度,如下图所示。 。有人知道如何回调剩余时间吗?

【问题讨论】:

    标签: android retrofit


    【解决方案1】:

    现在我想显示有关该文件下载的信息。 Like 1 - 100% 完成进度

    您的图片显示剩余时间,但一旦您知道完成百分比,您就可以自己计算时间。以下是我发现使用 Retrofit 2 获得百分比进度更新的方法:

    首先,创建一个进度监听器:

    final ProgressResponseBody.ProgressListener progressListener = new ProgressResponseBody.ProgressListener() {
        @Override public void update(long bytesRead, long contentLength, boolean done) {
            int percent = (int)((100 * bytesRead) / contentLength);
            //Do something with the progress (I sent the event through EventBus)        
        }
    };
    

    接下来,创建一个如图所示的客户端,它将调用监听器:

    OkHttpClient client = new OkHttpClient.Builder()
                .addNetworkInterceptor(new Interceptor() {
                    @Override
                    public Response intercept(Chain chain) throws IOException {
                        Response originalResponse = chain.proceed(chain.request());
                        return originalResponse.newBuilder()
                                .body(new ProgressResponseBody(originalResponse.body(), progressListener))
                                .build();
                    }
                })
                .build();
    

    最后,在构建 Reftrofit 时指定客户端:

    Retrofit retrofit = new Retrofit.Builder()
      .baseUrl(BASE_URL)
      .addConverterFactory(GsonConverterFactory.create())
      .client(client)
      .build()
    

    我花了一段时间才弄清楚这一点,我希望我能找到提供最终信息的链接,但这是我正在使用的代码。 (我以为是在 Future Studio 上,但我没看到。)

    【讨论】:

      猜你喜欢
      • 2016-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-13
      • 2017-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多