package org.aisen.wen.ui.model.impl;
import org.aisen.wen.component.network.task.ITaskManager;
import org.aisen.wen.component.network.task.TaskException;
import org.aisen.wen.component.network.task.WorkTask;
import org.aisen.wen.ui.model.IModel;
import org.aisen.wen.ui.model.listener.IModelListener;
import org.aisen.wen.ui.model.listener.ModelListenerParam;
import org.aisen.wen.ui.presenter.IContentPresenter;
import java.io.Serializable;
/**
* Created by wangdan on 16/9/30.
*/
public abstract class AContentModel<Result extends Serializable> implements IModel<Result> {
private static final String TASK_ID = "ModeTask";
private ITaskManager taskManager;
private IModelListener<Result> modelListener;
private ContentModelTask mTask;
@Override
public void setCallback(IModelListener<Result> listener) {
modelListener = listener;
if (modelListener instanceof ITaskManager) {
taskManager = (ITaskManager) modelListener;
}
}
@Override
public IModelListener<Result> getCallback() {
return modelListener;
}
@Override
public void execute() {
new ContentModelTask().execute();
}
@Override
public String getTaskId() {
return TASK_ID;
}
class ContentModelTask extends WorkTask<Void, Void, Result> {
public ContentModelTask() {
super(AContentModel.this.getTaskId(), taskManager);
if (mTask != null) {
mTask.cancel(true);
}
mTask = this;
}
@Override
protected void onPrepare() {
super.onPrepare();
getCallback().onPrepare(getListenerParam(IContentPresenter.TaskState.prepare, null, null));
}
@Override
public Result workInBackground(Void... params) throws TaskException {
return AContentModel.this.workInBackground();
}
@Override
protected void onSuccess(final Result result) {
super.onSuccess(result);
getCallback().onSuccess(getListenerParam(IContentPresenter.TaskState.success, null, result));
}
@Override
protected void onFailure(final TaskException exception) {
super.onFailure(exception);
getCallback().onFailure(getListenerParam(IContentPresenter.TaskState.falid, exception, null));
}
@Override
protected void onFinished() {
super.onFinished();
getCallback().onFinished(getListenerParam(IContentPresenter.TaskState.finished, null, null));
mTask = null;
}
ModelListenerParam<Result> getListenerParam(IContentPresenter.TaskState taskState, TaskException exception, Result result) {
return new ModelListenerParam(taskState, result, exception);
}
}
@Override
public boolean isRunning() {
return mTask != null;
}
/**
* 执行异步任务
*
* @return
* @throws TaskException
*/
abstract protected Result workInBackground() throws TaskException;
}