parent
a33df648ab
commit
ff81d43e72
@ -0,0 +1,139 @@ |
|||||||
|
/* |
||||||
|
* 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.common; |
||||||
|
|
||||||
|
import android.os.Handler; |
||||||
|
import com.arialyy.aria.core.AriaManager; |
||||||
|
import com.arialyy.aria.core.inf.AbsEntity; |
||||||
|
import com.arialyy.aria.core.inf.AbsTask; |
||||||
|
import com.arialyy.aria.core.inf.AbsTaskEntity; |
||||||
|
import com.arialyy.aria.core.inf.IEntity; |
||||||
|
import com.arialyy.aria.core.inf.IEventListener; |
||||||
|
import com.arialyy.aria.core.inf.TaskSchedulerType; |
||||||
|
import com.arialyy.aria.core.scheduler.ISchedulers; |
||||||
|
import com.arialyy.aria.util.CommonUtil; |
||||||
|
import java.lang.ref.WeakReference; |
||||||
|
|
||||||
|
public abstract class BaseListener<ENTITY extends AbsEntity, TASK_ENTITY extends AbsTaskEntity<ENTITY>, TASK extends AbsTask<ENTITY, TASK_ENTITY>> |
||||||
|
implements IEventListener { |
||||||
|
private static final String TAG = "BaseListener"; |
||||||
|
protected WeakReference<Handler> outHandler; |
||||||
|
private int RUN_SAVE_INTERVAL = 5 * 1000; //5s保存一次下载中的进度
|
||||||
|
private long mLastLen; //上一次发送长度
|
||||||
|
private boolean isFirst = true; |
||||||
|
private TASK mTask; |
||||||
|
private long mLastSaveTime; |
||||||
|
protected ENTITY mEntity; |
||||||
|
protected TASK_ENTITY mTaskEntity; |
||||||
|
protected boolean isConvertSpeed; |
||||||
|
protected long mUpdateInterval; |
||||||
|
protected AriaManager manager; |
||||||
|
|
||||||
|
protected BaseListener(TASK task, Handler outHandler) { |
||||||
|
this.outHandler = new WeakReference<>(outHandler); |
||||||
|
this.mTask = new WeakReference<>(task).get(); |
||||||
|
this.mEntity = mTask.getTaskEntity().getEntity(); |
||||||
|
this.mTaskEntity = mTask.getTaskEntity(); |
||||||
|
manager = AriaManager.getInstance(AriaManager.APP); |
||||||
|
mLastLen = mEntity.getCurrentProgress(); |
||||||
|
mLastSaveTime = System.currentTimeMillis(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override public void onPre() { |
||||||
|
saveData(IEntity.STATE_PRE, -1); |
||||||
|
sendInState2Target(ISchedulers.PRE); |
||||||
|
} |
||||||
|
|
||||||
|
@Override public void onStart(long startLocation) { |
||||||
|
saveData(IEntity.STATE_RUNNING, startLocation); |
||||||
|
sendInState2Target(ISchedulers.START); |
||||||
|
} |
||||||
|
|
||||||
|
@Override public void onResume(long resumeLocation) { |
||||||
|
saveData(IEntity.STATE_RUNNING, resumeLocation); |
||||||
|
sendInState2Target(ISchedulers.RESUME); |
||||||
|
} |
||||||
|
|
||||||
|
@Override public void onProgress(long currentLocation) { |
||||||
|
mEntity.setCurrentProgress(currentLocation); |
||||||
|
long speed = currentLocation - mLastLen; |
||||||
|
if (isFirst) { |
||||||
|
speed = 0; |
||||||
|
isFirst = false; |
||||||
|
} |
||||||
|
handleSpeed(speed); |
||||||
|
sendInState2Target(ISchedulers.RUNNING); |
||||||
|
if (System.currentTimeMillis() - mLastSaveTime >= RUN_SAVE_INTERVAL) { |
||||||
|
saveData(IEntity.STATE_RUNNING, currentLocation); |
||||||
|
mLastSaveTime = System.currentTimeMillis(); |
||||||
|
} |
||||||
|
|
||||||
|
mLastLen = currentLocation; |
||||||
|
} |
||||||
|
|
||||||
|
@Override public void onStop(long stopLocation) { |
||||||
|
saveData(mTask.getSchedulerType() == TaskSchedulerType.TYPE_STOP_AND_WAIT ? IEntity.STATE_WAIT |
||||||
|
: IEntity.STATE_STOP, stopLocation); |
||||||
|
handleSpeed(0); |
||||||
|
sendInState2Target(ISchedulers.STOP); |
||||||
|
} |
||||||
|
|
||||||
|
@Override public void onComplete() { |
||||||
|
saveData(IEntity.STATE_COMPLETE, mEntity.getFileSize()); |
||||||
|
handleSpeed(0); |
||||||
|
sendInState2Target(ISchedulers.COMPLETE); |
||||||
|
} |
||||||
|
|
||||||
|
@Override public void onCancel() { |
||||||
|
saveData(IEntity.STATE_CANCEL, -1); |
||||||
|
handleSpeed(0); |
||||||
|
sendInState2Target(ISchedulers.CANCEL); |
||||||
|
} |
||||||
|
|
||||||
|
@Override public void onFail(boolean needRetry) { |
||||||
|
mEntity.setFailNum(mEntity.getFailNum() + 1); |
||||||
|
saveData(IEntity.STATE_FAIL, mEntity.getCurrentProgress()); |
||||||
|
handleSpeed(0); |
||||||
|
mTask.needRetry = needRetry; |
||||||
|
sendInState2Target(ISchedulers.FAIL); |
||||||
|
} |
||||||
|
|
||||||
|
private void handleSpeed(long speed) { |
||||||
|
if (mUpdateInterval != 1000) { |
||||||
|
speed = speed * 1000 / mUpdateInterval; |
||||||
|
} |
||||||
|
if (isConvertSpeed) { |
||||||
|
mEntity.setConvertSpeed(CommonUtil.formatFileSize(speed < 0 ? 0 : speed) + "/s"); |
||||||
|
} |
||||||
|
mEntity.setSpeed(speed < 0 ? 0 : speed); |
||||||
|
|
||||||
|
mEntity.setPercent((int) (mEntity.getFileSize() <= 0 ? 0 |
||||||
|
: mEntity.getCurrentProgress() * 100 / mEntity.getFileSize())); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 将任务状态发送给下载器 |
||||||
|
* |
||||||
|
* @param state {@link ISchedulers#START} |
||||||
|
*/ |
||||||
|
protected void sendInState2Target(int state) { |
||||||
|
if (outHandler.get() != null) { |
||||||
|
outHandler.get().obtainMessage(state, mTask).sendToTarget(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
protected abstract void saveData(int state, long location); |
||||||
|
} |
@ -1,35 +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.download; |
|
||||||
|
|
||||||
import android.os.Handler; |
|
||||||
import com.arialyy.aria.core.inf.IDownloadListener; |
|
||||||
|
|
||||||
/** |
|
||||||
* Created by Aria.Lao on 2017/7/20. |
|
||||||
* 普通任务下载的事件监听器 |
|
||||||
*/ |
|
||||||
class DownloadListener extends BaseDListener<DownloadEntity, DownloadTaskEntity, DownloadTask> |
|
||||||
implements IDownloadListener { |
|
||||||
DownloadListener(DownloadTask task, Handler outHandler) { |
|
||||||
super(task, outHandler); |
|
||||||
} |
|
||||||
|
|
||||||
@Override public void supportBreakpoint(boolean support) { |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
} |
|
Loading…
Reference in new issue