postError method
在 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);
}