package me.xiaopan.sketch.request; import me.xiaopan.sketch.Sketch; abstract class AsyncRequest extends BaseRequest implements Runnable{ private RunStatus runStatus; private boolean sync; AsyncRequest(Sketch sketch, BaseInfo info) { super(sketch, info); } @Override public final void run() { if (runStatus != null) { switch (runStatus) { case DISPATCH: executeDispatch(); break; case DOWNLOAD: executeDownload(); break; case LOAD: executeLoad(); break; default: new IllegalArgumentException("unknown runStatus: " + runStatus.name()).printStackTrace(); break; } } } /** * 是否同步执行 */ public boolean isSync() { return sync; } /** * 设置是否同步执行 */ public void setSync(boolean sync) { this.sync = sync; } /** * 提交到分发线程执行分发 */ protected void submitRunDispatch() { this.runStatus = RunStatus.DISPATCH; if (sync) { executeDispatch(); } else { getConfiguration().getRequestExecutor().submitDispatch(this); } } private void executeDispatch(){ setStatus(Status.START_DISPATCH); runDispatch(); } /** * 提交到网络线程执行下载 */ protected void submitRunDownload() { this.runStatus = RunStatus.DOWNLOAD; if (sync) { executeDownload(); } else { getConfiguration().getRequestExecutor().submitDownload(this); } } private void executeDownload(){ setStatus(Status.START_DOWNLOAD); runDownload(); } /** * 提交到本地线程执行加载 */ protected void submitRunLoad() { this.runStatus = RunStatus.LOAD; if (sync) { executeLoad(); } else { getConfiguration().getRequestExecutor().submitLoad(this); } } private void executeLoad(){ setStatus(Status.START_LOAD); runLoad(); } /** * 提交请求 */ final void submit() { submitRunDispatch(); } /** * 推到主线程处理完成 */ protected void postRunCompleted() { CallbackHandler.postRunCompleted(this); } /** * 推到主线程处理取消 */ void postRunCanceled() { CallbackHandler.postRunCanceled(this); } /** * 推到主线程处理失败 */ protected void postRunError() { CallbackHandler.postRunError(this); } /** * 推到主线程处理进度 */ void postRunUpdateProgress(int totalLength, int completedLength) { CallbackHandler.postRunUpdateProgress(this, totalLength, completedLength); } /** * 在分发线程执行分发 */ protected abstract void runDispatch(); /** * 在网络线程执行下载 */ protected abstract void runDownload(); /** * 在本地线程执行加载 */ protected abstract void runLoad(); /** * 在主线程处理进度 */ protected abstract void runUpdateProgressInMainThread(int totalLength, int completedLength); /** * 在主线程处理完成 */ protected abstract void runCompletedInMainThread(); /** * 在主线程处理失败 */ protected abstract void runErrorInMainThread(); /** * 在主线程处理取消 */ protected abstract void runCanceledInMainThread(); /** * 运行状态 */ private enum RunStatus { /** * 分发 */ DISPATCH, /** * 加载 */ LOAD, /** * 下载 */ DOWNLOAD, } }