postError method

  1. @override
  2. @mustCallSuper
void postError(
  1. Object error
)
override

createTask 的返回值出错之后调用

Implementation

@override
@mustCallSuper
void postError(Object error) async {
  // 处理 Dio 异常
  if (error is DioError) {
    if (_checkIfNeedRetry(error)) {
      if (_isHostUnavailable(error)) {
        config.hostProvider.freezeHost(error.requestOptions.path);
      }
      if (retryCount < retryLimit) {
        retryCount++;
        // TODO 这里也许有优化空间,任务不应该自己重启自己,而应该通过消息或者报错告诉负责这个任务的管理者去重试
        manager.restartTask(this);
        return;
      }
    }

    final storageError = StorageError.fromDioError(error);

    // 通知状态
    if (error.type == DioErrorType.cancel) {
      postCancel(storageError);
    } else {
      controller?.notifyStatusListeners(StorageStatus.Error);
    }

    super.postError(storageError);
    return;
  }

  // 处理 Storage 异常。如果有子任务,错误可能被子任务加工成 StorageError
  if (error is StorageError) {
    if (error.type == StorageErrorType.CANCEL) {
      postCancel(error);
    } else {
      controller?.notifyStatusListeners(StorageStatus.Error);
    }

    super.postError(error);
    return;
  }

  // 不能处理的异常
  if (error is Error) {
    controller?.notifyStatusListeners(StorageStatus.Error);
    final storageError = StorageError.fromError(error);
    super.postError(storageError);
    return;
  }

  controller?.notifyStatusListeners(StorageStatus.Error);
  super.postError(error);
}