Как насчет Android DownloadManager изменить интервал обновления

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

но значение 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

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


person jeong.guhyeon    schedule 04.03.2020    source источник
comment
Вы нашли решение? У меня такой же вопрос   -  person max    schedule 07.04.2020
comment
Я до сих пор не нашел решения, поэтому в итоге использовал Retrofit.   -  person jeong.guhyeon    schedule 23.04.2020


Ответы (1)


У меня была та же проблема, что я сделал, так это вызвать этот метод, который устанавливает 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()
    }
}
person max    schedule 07.04.2020