Как насчет Anroid DownloadManager изменить интервал обновления - PullRequest
0 голосов
/ 04 марта 2020

Я попытался получить файл с сервера с помощью Android downloadManager и подтвердил, что он работает правильно.

но значение COLUMN_BYTES_DOWNLOADED_SO_FAR меняется примерно каждые 1-2 секунды, поэтому полоса программы плавно не увеличивается. Есть ли способ изменить интервал обновления?

boolean downloading = true;
int oldProgressValue = 0;
int lastProgressValue = 0;
long startTime = System.currentTimeMillis();

try {
    while (downloading) {
        DownloadManager.Query q = new DownloadManager.Query();
        q.setFilterById(downloadId);
        Cursor cursor = downloadManager.query(q);
        cursor.moveToFirst();
        int bytes_total = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));

        cursor.moveToFirst();
        int bytes_downloaded = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));

        if (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_SUCCESSFUL) {
            downloading = false;
        }

        //0 ~ 100
        lastProgressValue = (int) ((bytes_downloaded * 100l) / bytes_total);

        Thread.sleep(50);

        if (timeOut > 0) {
            downloading = UpdateTimeOut(startTime, oldProgressValue, lastProgressValue);
        }

        if (oldProgressValue != lastProgressValue) {
            oldProgressValue = lastProgressValue;
            int finalOldProgressValue = oldProgressValue;
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    textView.setText(String.valueOf(finalOldProgressValue));
                }
            });
        }
        cursor.close();
    }
} catch (InterruptedException e) {
    e.printStackTrace();
} finally {

}

Дополнительно

Android Диспетчер загрузок с диалогом прогресса

Тот же вопрос и я попробовал как ответ, но он не решил.

Android DownloadManager Progress

Я также применил ответ на вопрос, но не получил обновленное значение .

1 Ответ

0 голосов
/ 07 апреля 2020

У меня была та же проблема: я вызывал этот метод, который устанавливает ValueAnimator каждый раз, когда меняется COLUMN_BYTES_DOWNLOADED_SO_FAR, и это делает его гладким

   private fun updateProgressBar(progress: Int){
     runOnUiThread {
        val progressAnimator = ValueAnimator.ofFloat(pb_download_video.progress.toFloat(), progress.toFloat())
        progressAnimator.duration = 300
        progressAnimator.addUpdateListener {
            val value: Int = (it.animatedValue as Float).toInt()
            binding.pbDownloadVideo.progress = value
        }
        progressAnimator.doOnEnd { if (progress == 100) // action when is done loading }
        progressAnimator.start()
    }
}
...