start method

  1. @override
WorkFuture<D, T> start({
  1. int retry = 0,
  2. OnProgress? onSendProgress,
  3. OnProgress? onReceiveProgress,
})
override

启动任务

返回包含执行结果TWorkFuture

  • retry为内部网络请求失败时的最大重试次数,0表示不重试,实际请求1次,1表示重试1次,实际最多请求两次,以此类推,
  • onSendProgress为数据发送/上传进度监听器,在HttpMethod.getHttpMethod.head中无效, 以及设置了WorkRequestOptions.downloadPath的下载任务中无效,
  • onReceiveProgress为数据接收/下载进度监听器,
  • 多次调用会启动多次请求

Implementation

@override
WorkFuture<D, T> start({
  int retry = 0,
  OnProgress? onSendProgress,
  OnProgress? onReceiveProgress,
}) {
  /// 日志标签
  final tag = '$runtimeType@${hashCode.toRadixString(16)}';

  log(tag, 'work start');

  void Function()? onCancel;

  final future = WorkFuture<D, T>._(tag, () => onCancel?.call());

  Future<void> onDo() async {
    int restart = 0;
    dynamic extra;
    T data;
    do {
      data = onCreateWorkData();
      data._restartCount = restart;
      data.extra = extra;
      onCancel = () => data.options?.cancelToken.cancel();
      if (!await _onDo(
        tag: tag,
        data: data,
        retry: retry,
        onSendProgress: onSendProgress,
        onReceiveProgress: onReceiveProgress,
      )) {
        break;
      }
      extra = data.extra;
    } while (restart++ < onMaxRestart());

    future._complete(data);
  }

  onDo();

  return future;
}