package com.shizhefei.task.tasks;
import com.shizhefei.mvc.RequestHandle;
import com.shizhefei.mvc.ResponseSender;
import com.shizhefei.task.Code;
import com.shizhefei.task.IAsyncTask;
import com.shizhefei.task.TaskHelper;
import com.shizhefei.task.function.Func2;
import com.shizhefei.task.imp.SimpleCallback;
/**
* Created by luckyjayce on 2017/4/16.
*/
class CombineTask<D1, D2, DATA> extends LinkTask<DATA> {
private IAsyncTask<D1> task1;
private IAsyncTask<D2> task2;
private Func2<D1, D2, DATA> func2;
private TaskHelper<Object> taskHelper;
private D1 data1;
private D2 data2;
private boolean d1Success;
private boolean d2Success;
public CombineTask(IAsyncTask<D1> task1, IAsyncTask<D2> task2, Func2<D1, D2, DATA> func2) {
this.task1 = task1;
this.task2 = task2;
this.func2 = func2;
taskHelper = new TaskHelper<>();
}
@Override
public RequestHandle execute(final ResponseSender<DATA> sender) throws Exception {
taskHelper.execute(task1, new SimpleCallback<D1>() {
@Override
public void onProgress(Object task, int percent, long current, long total, Object extraData) {
super.onProgress(task, percent, current, total, extraData);
sender.sendProgress(current, total, extraData);
}
@Override
public void onPostExecute(Object task, Code code, Exception exception, D1 d1) {
switch (code) {
case SUCCESS:
data1 = d1;
d1Success = true;
combine(sender);
break;
case EXCEPTION:
sender.sendError(exception);
taskHelper.cancelAll();
break;
case CANCEL:
break;
}
}
});
taskHelper.execute(task2, new SimpleCallback<D2>() {
@Override
public void onProgress(Object task, int percent, long current, long total, Object extraData) {
super.onProgress(task, percent, current, total, extraData);
sender.sendProgress(current, total, extraData);
}
@Override
public void onPostExecute(Object task, Code code, Exception exception, D2 d2) {
switch (code) {
case SUCCESS:
data2 = d2;
d2Success = true;
combine(sender);
break;
case EXCEPTION:
sender.sendError(exception);
taskHelper.cancelAll();
break;
case CANCEL:
break;
}
}
});
return taskHelper;
}
private void combine(ResponseSender<DATA> sender) {
if (d1Success && d2Success) {
try {
DATA data = func2.call(data1, data2);
sender.sendData(data);
} catch (Exception e) {
e.printStackTrace();
sender.sendError(e);
}
}
}
}