@Override public boolean dispatchTaskEnd(DownloadTask task, EndCause cause, @Nullable Exception realCause, @NonNull Listener4Assist.Listener4Model model) { final Listener4SpeedModel speedModel = (Listener4SpeedModel) model; final SpeedCalculator speedCalculator; if (speedModel.taskSpeed != null) { speedCalculator = speedModel.taskSpeed; speedCalculator.endTask(); } else { speedCalculator = new SpeedCalculator(); } if (callback != null) { callback.taskEnd(task, cause, realCause, speedCalculator); } return true; }
@Override public void fetchProgress(@NonNull DownloadTask task, int blockIndex, long increaseBytes) { super.fetchProgress(task, blockIndex, increaseBytes); speedCalculator.downloading(increaseBytes); final String status = "progress " + speedCalculator.speed(); statusTv.setText(status); final long offset = progress.addAndGet(increaseBytes); ProgressUtil.updateProgressToViewWithMark(progressBar, offset); }
@Override public void taskEnd(@NonNull DownloadTask task, @NonNull EndCause cause, @Nullable Exception realCause) { if (realCause != null) { Log.e("ContentUriActivity", "taskEnd with realCause", realCause); } final String status = "taskEnd " + cause + " " + speedCalculator.averageSpeed(); statusTv.setText(status); actionView.setTag(null); actionTv.setText(R.string.start); } }
/** * Get bytes per-second and only if duration is greater than or equal to 1 second will flush and * re-calculate speed. */ public synchronized long getBytesPerSecondAndFlush() { final long interval = nowMillis() - timestamp; if (interval < 1000 && bytesPerSecond != 0) return bytesPerSecond; // the first time we using 500 milliseconds to let speed valid more quick if (bytesPerSecond == 0 && interval < 500) return 0; return getInstantBytesPerSecondAndFlush(); }
/** * With wikipedia: https://en.wikipedia.org/wiki/Kibibyte * <p> * 1KiB = 2^10B = 1024B * 1MiB = 2^10KB = 1024KB */ public String getSpeedWithBinaryAndFlush() { return humanReadableSpeed(getInstantBytesPerSecondAndFlush(), false); }
public String speedFromBegin() { return humanReadableSpeed(getBytesPerSecondFromBegin(), true); }
long now = 66; long firstTimestamp = now; doReturn(now).when(calculator).nowMillis(); calculator.downloading(10); calculator.downloading(20); assertThat(calculator.getInstantBytesPerSecondAndFlush()).isEqualTo(30000); calculator.downloading(60); doReturn(now).when(calculator).nowMillis(); assertThat(calculator.getInstantBytesPerSecondAndFlush()).isEqualTo(3000); assertThat(calculator.timestamp).isEqualTo(now); assertThat(calculator.beginTimestamp).isEqualTo(firstTimestamp); doReturn(now).when(calculator).nowMillis(); calculator.downloading(10); calculator.endTask(); assertThat(calculator.getInstantBytesPerSecondAndFlush()).isEqualTo(1000); assertThat(calculator.getBytesPerSecondFromBegin()).isEqualTo(3333); calculator.reset(); assertThat(calculator.getBytesPerSecondFromBegin()).isEqualTo(0);
@Test public void speed() { long now = 66; doReturn(now).when(calculator).nowMillis(); calculator.downloading(1000); now = 565; doReturn(now).when(calculator).nowMillis(); assertThat(calculator.speed()).isEqualTo("0 B/s"); now = 566; doReturn(now).when(calculator).nowMillis(); assertThat(calculator.speed()).isEqualTo("2.0 kB/s"); now = 1066; doReturn(now).when(calculator).nowMillis(); // because than 1 second and last speed is 2.0 assertThat(calculator.speed()).isEqualTo("2.0 kB/s"); }
@Override public void taskStart(@NonNull DownloadTask task) { actionTv.setText(R.string.cancel); actionView.setTag(new Object()); statusTv.setText(R.string.start); speedCalculator = new SpeedCalculator(); }
@Override public boolean dispatchFetchProgress(@NonNull DownloadTask task, int blockIndex, long increaseBytes, @NonNull Listener4Assist.Listener4Model model) { final Listener4SpeedModel speedModel = (Listener4SpeedModel) model; speedModel.blockSpeeds.get(blockIndex).downloading(increaseBytes); speedModel.taskSpeed.downloading(increaseBytes); if (callback != null) { callback.progressBlock(task, blockIndex, model.blockCurrentOffsetMap.get(blockIndex), speedModel.getBlockSpeed(blockIndex)); callback.progress(task, model.currentOffset, speedModel.taskSpeed); } return true; }
private void updateBunchInfoAndProgress() { bunchInfoTv.setText( "Total Progress: " + currentCount + "/" + totalCount + "(" + speedCalculator .speed() + ")"); bunchProgressBar.setMax(totalCount); bunchProgressBar.setProgress(currentCount); }
public synchronized void downloading(long increaseBytes) { if (timestamp == 0) { this.timestamp = nowMillis(); this.beginTimestamp = timestamp; } this.increaseBytes += increaseBytes; this.allIncreaseBytes += increaseBytes; }
@Test public void averageSpeed() { doReturn("1").when(calculator).speedFromBegin(); assertThat(calculator.averageSpeed()).isEqualTo("1"); }
@Test public void speedFromBegin() { doReturn(1L).when(calculator).getBytesPerSecondFromBegin(); assertThat(calculator.speedFromBegin()).isEqualTo("1 B/s"); } }
@Test public void getSpeedWithSIAndFlush() { doReturn(1054L).when(calculator).getInstantBytesPerSecondAndFlush(); assertThat(calculator.getSpeedWithSIAndFlush()).isEqualTo("1.1 kB/s"); }
@Override public boolean dispatchBlockEnd(DownloadTask task, int blockIndex, Listener4Assist.Listener4Model model) { final Listener4SpeedModel speedModel = (Listener4SpeedModel) model; speedModel.blockSpeeds.get(blockIndex).endTask(); if (callback != null) { callback.blockEnd(task, blockIndex, model.info.getBlock(blockIndex), speedModel.getBlockSpeed(blockIndex)); } return true; }
@Test public void instantSpeed() { doReturn("1").when(calculator).getSpeedWithSIAndFlush(); assertThat(calculator.instantSpeed()).isEqualTo("1"); }
@Test public void getSpeedWithBinaryAndFlush() { doReturn(1054L).when(calculator).getInstantBytesPerSecondAndFlush(); assertThat(calculator.getSpeedWithBinaryAndFlush()).isEqualTo("1.0 KiB/s"); }
@Test public void getInstantSpeedDurationMillis() { doReturn(2L).when(calculator).nowMillis(); calculator.timestamp = 1; assertThat(calculator.getInstantSpeedDurationMillis()).isOne(); }
/** * Get instant speed */ public String instantSpeed() { return getSpeedWithSIAndFlush(); }