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