package com.shizhefei.task.datasource; import com.shizhefei.mvc.IAsyncDataSource; import com.shizhefei.mvc.RequestHandle; import com.shizhefei.mvc.ResponseSender; import com.shizhefei.task.Code; import com.shizhefei.task.IAsyncTask; import com.shizhefei.task.ResponseSenderCallback; import com.shizhefei.task.TaskHelper; import com.shizhefei.task.tasks.LinkTask; import com.shizhefei.task.tasks.Tasks; /** * Created by luckyjayce on 2017/4/17. */ class ConcatDataSource<D, DATA> implements IAsyncDataSource<DATA> { private IAsyncDataSource<DATA> dataSource; private IAsyncTask<D> asyncTask; private ResponseSenderCallback<DATA> successCallback; public ConcatDataSource(IAsyncTask<D> asyncTask, IAsyncDataSource<DATA> dataSource) { this.dataSource = dataSource; this.asyncTask = asyncTask; } @Override public RequestHandle refresh(ResponseSender<DATA> sender) throws Exception { if (successCallback != null && successCallback.getCode() == Code.SUCCESS) { return dataSource.refresh(sender); } else { LinkTask<DATA> task = Tasks.concatWith(asyncTask, Tasks.create(dataSource, true)); return TaskHelper.createExecutor(task, successCallback = new ResponseSenderCallback<>(sender)).execute(); } } @Override public RequestHandle loadMore(ResponseSender<DATA> sender) throws Exception { if (successCallback != null && successCallback.getCode() == Code.SUCCESS) { return dataSource.loadMore(sender); } else { LinkTask<DATA> task = Tasks.concatWith(asyncTask, Tasks.create(dataSource, true)); return TaskHelper.createExecutor(task, successCallback = new ResponseSenderCallback<>(sender)).execute(); } } @Override public boolean hasMore() { return dataSource.hasMore(); } }