/** * Why pause? not stop? because invoke this method(pause) will clear all data about this task in * memory, and stop the total processing about this task. but when you start the paused task, it * would be continue downloading from the breakpoint as default. * * @return If true, successful pause this task by status of pause, otherwise this task has already * in over status before invoke this method(Maybe occur high concurrent situation). * @see FileDownloader#pause(int) * @see FileDownloader#pause(FileDownloadListener) * @see FileDownloader#pauseAll() */ public boolean pause() { if (FileDownloadStatus.isOver(getStatus())) { if (FileDownloadLog.NEED_LOG) { /** * The over-status call-backed and set the over-status to this task between here area and * remove from the {@link FileDownloadList}. * * <p>High concurrent cause. */ FileDownloadLog.d( this, "High concurrent cause, Already is over, can't pause " + "again, %d %d", getStatus(), getId()); } return false; } setStatus(FileDownloadStatus.paused); _pauseExecute(); calcAverageSpeed(this.soFarBytes); // For make sure already added event listener for receive paused event FileDownloadList.getImpl().add(this); FileDownloadList.getImpl().remove(this, MessageSnapshotTaker.catchPause(this)); return true; }
private void update(final MessageSnapshot snapshot) { setStatus(snapshot.getStatus()); this.isLargeFile = snapshot.isLargeFile(); switch (snapshot.getStatus()) { case FileDownloadStatus.pending: this.soFarBytes = snapshot.getLargeSofarBytes(); this.totalBytes = snapshot.getLargeTotalBytes(); // notify getMessenger().notifyPending(snapshot); break; case FileDownloadStatus.started: // notify getMessenger().notifyStarted(snapshot); break; case FileDownloadStatus.connected: this.totalBytes = snapshot.getLargeTotalBytes(); this.resuming = snapshot.isResuming(); this.etag = snapshot.getEtag(); markStartDownload(); // notify getMessenger().notifyConnected(snapshot); break; case FileDownloadStatus.progress: this.soFarBytes = snapshot.getLargeSofarBytes(); calcSpeed(snapshot.getLargeSofarBytes()); // notify getMessenger().notifyProgress(snapshot); break; // case FileDownloadStatus.blockComplete: /** Handled by {@link FileDownloadList#removeByCompleted(BaseDownloadTask)} */ // break; case FileDownloadStatus.retry: this.soFarBytes = snapshot.getLargeSofarBytes(); this.ex = snapshot.getThrowable(); _setRetryingTimes(snapshot.getRetryingTimes()); resetSpeed(); // notify getMessenger().notifyRetry(snapshot); break; case FileDownloadStatus.error: this.ex = snapshot.getThrowable(); this.soFarBytes = snapshot.getLargeSofarBytes(); calcAverageSpeed(this.soFarBytes); // to FileDownloadList FileDownloadList.getImpl().remove(this, snapshot); break; case FileDownloadStatus.paused: /** Handled by {@link #pause()} */ break; case FileDownloadStatus.completed: this.isReusedOldFile = snapshot.isReusedDownloadedFile(); if (snapshot.isReusedDownloadedFile()) { this.etag = snapshot.getEtag(); } // only carry total data back this.soFarBytes = snapshot.getLargeTotalBytes(); this.totalBytes = snapshot.getLargeTotalBytes(); calcAverageSpeed(this.soFarBytes); // to FileDownloadList FileDownloadList.getImpl().remove(this, snapshot); break; case FileDownloadStatus.warn: resetSpeed(); final int count = FileDownloadList.getImpl().count(getId()); if (count <= 1) { // 1. this progress kill by sys and relive, // for add at least one listener // or 2. pre downloading task has already completed/error/paused // request status final int currentStatus = _getStatusFromServer(downloadId); FileDownloadLog.w( this, "warn, but no listener to receive progress, " + "switch to pending %d %d", getId(), currentStatus); //noinspection StatementWithEmptyBody if (FileDownloadStatus.isIng(currentStatus)) { // ing, has callbacks // keep and wait callback setStatus(FileDownloadStatus.pending); this.totalBytes = snapshot.getLargeTotalBytes(); this.soFarBytes = snapshot.getLargeSofarBytes(); markStartDownload(); ((MessageSnapshot.IWarnMessageSnapshot) snapshot).turnToPending(); getMessenger().notifyPending(snapshot); break; } else { // already over and no callback } } // to FileDownloadList FileDownloadList.getImpl().remove(this, snapshot); break; } }