web-dev-qa-db-fra.com

Square`s OkHttp. Progression du téléchargement

Existe-t-il un moyen de faire progresser le téléchargement du fichier en utilisant square`s OkHttp ?

Je n'ai trouvé aucune solution dans Recipes .

Ils ont la classe Call qui peut obtenir du contenu de manière asynchrone, mais il n’existe aucune méthode pour obtenir les progrès en cours.

14
Kalyaganov Alexey

Oups la réponse était évidente. Désolé pour la question stupide. Juste besoin de lire InputStream comme d'habitude.

private class AsyncDownloader extends AsyncTask<Void, Long, Boolean> {
    private final String URL = "file_url";

    @Override
    protected Boolean doInBackground(Void... params) {
        OkHttpClient httpClient = new OkHttpClient();
        Call call = httpClient.newCall(new Request.Builder().url(URL).get().build());
        try {
            Response response = call.execute();
            if (response.code() == 200) {
                InputStream inputStream = null;
                try {
                    inputStream = response.body().byteStream();
                    byte[] buff = new byte[1024 * 4];
                    long downloaded = 0;
                    long target = response.body().contentLength();

                    publishProgress(0L, target);
                    while (true) {
                        int readed = inputStream.read(buff);
                        if(readed == -1){
                            break;
                        }
                        //write buff
                        downloaded += readed;
                        publishProgress(downloaded, target);
                        if (isCancelled()) {
                            return false;
                        }
                    }
                    return downloaded == target;
                } catch (IOException ignore) {
                    return false;
                } finally {
                    if (inputStream != null) {
                        inputStream.close();
                    }
                }
            } else {
                return false;
            }
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

    @Override
    protected void onProgressUpdate(Long... values) {
        progressBar.setMax(values[1].intValue());
        progressBar.setProgress(values[0].intValue());

        textViewProgress.setText(String.format("%d / %d", values[0], values[1]));
    }

    @Override
    protected void onPostExecute(Boolean result) {
        textViewStatus.setText(result ? "Downloaded" : "Failed");
    }
}
23
Kalyaganov Alexey

Vous pouvez utiliser la recette okHttp: Progress.Java

1
Christian

chaque fois dans la boucle while, vous publiez la progression.Alors c'est comme être bloqué

0
Francis Shi