parent
102d3ba0f6
commit
c39bfbdd88
@ -1,146 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria)
|
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
||||||
* you may not use this file except in compliance with the License. |
|
||||||
* You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software |
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, |
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
||||||
* See the License for the specific language governing permissions and |
|
||||||
* limitations under the License. |
|
||||||
*/ |
|
||||||
package com.arialyy.aria.core.group; |
|
||||||
|
|
||||||
import android.os.Handler; |
|
||||||
import com.arialyy.aria.core.download.DownloadEntity; |
|
||||||
import com.arialyy.aria.core.inf.IEntity; |
|
||||||
import com.arialyy.aria.core.listener.IDLoadListener; |
|
||||||
import com.arialyy.aria.core.listener.ISchedulers; |
|
||||||
import com.arialyy.aria.exception.BaseException; |
|
||||||
import com.arialyy.aria.util.CommonUtil; |
|
||||||
|
|
||||||
/** |
|
||||||
* 子任务事件监听 |
|
||||||
*/ |
|
||||||
public class ChildDLoadListener implements IDLoadListener { |
|
||||||
private DownloadEntity subEntity; |
|
||||||
private int RUN_SAVE_INTERVAL = 5 * 1000; //5s保存一次下载中的进度
|
|
||||||
private long lastSaveTime; |
|
||||||
private long lastLen; |
|
||||||
private Handler schedulers; |
|
||||||
private AbsSubDLoadUtil loader; |
|
||||||
|
|
||||||
ChildDLoadListener(Handler schedulers, AbsSubDLoadUtil loader) { |
|
||||||
this.loader = loader; |
|
||||||
this.schedulers = schedulers; |
|
||||||
subEntity = loader.getEntity(); |
|
||||||
subEntity.setFailNum(0); |
|
||||||
lastLen = subEntity.getCurrentProgress(); |
|
||||||
lastSaveTime = System.currentTimeMillis(); |
|
||||||
} |
|
||||||
|
|
||||||
@Override public void supportBreakpoint(boolean support) { |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
@Override public void onPre() { |
|
||||||
saveData(IEntity.STATE_PRE, subEntity.getCurrentProgress()); |
|
||||||
} |
|
||||||
|
|
||||||
@Override public void onPostPre(long fileSize) { |
|
||||||
subEntity.setFileSize(fileSize); |
|
||||||
subEntity.setConvertFileSize(CommonUtil.formatFileSize(fileSize)); |
|
||||||
saveData(IEntity.STATE_POST_PRE, subEntity.getCurrentProgress()); |
|
||||||
sendToTarget(ISchedulers.POST_PRE, loader); |
|
||||||
} |
|
||||||
|
|
||||||
@Override public void onResume(long resumeLocation) { |
|
||||||
lastLen = resumeLocation; |
|
||||||
saveData(IEntity.STATE_POST_PRE, subEntity.getCurrentProgress()); |
|
||||||
sendToTarget(ISchedulers.START, loader); |
|
||||||
} |
|
||||||
|
|
||||||
@Override public void onStart(long startLocation) { |
|
||||||
lastLen = startLocation; |
|
||||||
saveData(IEntity.STATE_POST_PRE, subEntity.getCurrentProgress()); |
|
||||||
sendToTarget(ISchedulers.START, loader); |
|
||||||
} |
|
||||||
|
|
||||||
@Override public void onProgress(long currentLocation) { |
|
||||||
long diff = currentLocation - lastLen; |
|
||||||
//mCurrentLocation += speed;
|
|
||||||
subEntity.setCurrentProgress(currentLocation); |
|
||||||
handleSpeed(diff); |
|
||||||
sendToTarget(ISchedulers.RUNNING, loader); |
|
||||||
if (System.currentTimeMillis() - lastSaveTime >= RUN_SAVE_INTERVAL) { |
|
||||||
saveData(IEntity.STATE_RUNNING, currentLocation); |
|
||||||
lastSaveTime = System.currentTimeMillis(); |
|
||||||
} |
|
||||||
lastLen = currentLocation; |
|
||||||
} |
|
||||||
|
|
||||||
@Override public void onStop(long stopLocation) { |
|
||||||
handleSpeed(0); |
|
||||||
saveData(IEntity.STATE_STOP, stopLocation); |
|
||||||
sendToTarget(ISchedulers.STOP, loader); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 组合任务子任务不允许删除 |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
@Override public void onCancel() { |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
@Override public void onComplete() { |
|
||||||
subEntity.setComplete(true); |
|
||||||
saveData(IEntity.STATE_COMPLETE, subEntity.getFileSize()); |
|
||||||
handleSpeed(0); |
|
||||||
sendToTarget(ISchedulers.COMPLETE, loader); |
|
||||||
} |
|
||||||
|
|
||||||
@Override public void onFail(boolean needRetry, BaseException e) { |
|
||||||
subEntity.setFailNum(subEntity.getFailNum() + 1); |
|
||||||
saveData(IEntity.STATE_FAIL, subEntity.getCurrentProgress()); |
|
||||||
handleSpeed(0); |
|
||||||
sendToTarget(ISchedulers.FAIL, loader); |
|
||||||
} |
|
||||||
|
|
||||||
private void handleSpeed(long speed) { |
|
||||||
subEntity.setSpeed(speed); |
|
||||||
subEntity.setConvertSpeed( |
|
||||||
speed <= 0 ? "" : String.format("%s/s", CommonUtil.formatFileSize(speed))); |
|
||||||
subEntity.setPercent((int) (subEntity.getFileSize() <= 0 ? 0 |
|
||||||
: subEntity.getCurrentProgress() * 100 / subEntity.getFileSize())); |
|
||||||
} |
|
||||||
|
|
||||||
private void saveData(int state, long location) { |
|
||||||
loader.getWrapper().setState(state); |
|
||||||
subEntity.setState(state); |
|
||||||
subEntity.setComplete(state == IEntity.STATE_COMPLETE); |
|
||||||
if (state == IEntity.STATE_CANCEL) { |
|
||||||
subEntity.deleteData(); |
|
||||||
} else if (state == IEntity.STATE_STOP) { |
|
||||||
subEntity.setStopTime(System.currentTimeMillis()); |
|
||||||
} else if (subEntity.isComplete()) { |
|
||||||
subEntity.setCompleteTime(System.currentTimeMillis()); |
|
||||||
subEntity.setCurrentProgress(subEntity.getFileSize()); |
|
||||||
} else if (location > 0) { |
|
||||||
subEntity.setCurrentProgress(location); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 发送状态到子任务调度器{@link SimpleSchedulers},让调度器处理任务调度 |
|
||||||
* |
|
||||||
* @param state {@link ISchedulers} |
|
||||||
*/ |
|
||||||
private void sendToTarget(int state, AbsSubDLoadUtil util) { |
|
||||||
schedulers.obtainMessage(state, util).sendToTarget(); |
|
||||||
} |
|
||||||
} |
|
Loading…
Reference in new issue