From 2ccdcc4a8a893bd3fe618cce09dd03a1fd9da27e Mon Sep 17 00:00:00 2001 From: Neeraj Gupta Date: Mon, 19 Jul 2021 20:47:01 +0530 Subject: [PATCH] Track counter for fileDownload requests & cancel only when counter <= zero --- lib/ui/thumbnail_widget.dart | 2 +- lib/utils/thumbnail_util.dart | 21 ++++++++++++++------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/lib/ui/thumbnail_widget.dart b/lib/ui/thumbnail_widget.dart index 10d4059c4..e18e5ddf5 100644 --- a/lib/ui/thumbnail_widget.dart +++ b/lib/ui/thumbnail_widget.dart @@ -85,7 +85,7 @@ class _ThumbnailWidgetState extends State { @override void dispose() { super.dispose(); - Future.delayed(Duration.zero, () { + Future.delayed(Duration(milliseconds: 10), () { // Cancel request only if the widget has been unmounted if (!mounted && widget.file.localID == null && !_hasLoadedThumbnail) { removePendingGetThumbnailRequestIfAny(widget.file); diff --git a/lib/utils/thumbnail_util.dart b/lib/utils/thumbnail_util.dart index 8ada71e9d..32e69a2c9 100644 --- a/lib/utils/thumbnail_util.dart +++ b/lib/utils/thumbnail_util.dart @@ -20,14 +20,15 @@ import 'dart:io' as io; final _logger = Logger("ThumbnailUtil"); final _map = LinkedHashMap(); final _queue = Queue(); -const int kMaximumConcurrentDownloads = 2500; +const int kMaximumConcurrentDownloads = 500; class FileDownloadItem { final File file; final Completer completer; final CancelToken cancelToken; + int counter = 0; // number of times file download was requested - FileDownloadItem(this.file, this.completer, this.cancelToken); + FileDownloadItem(this.file, this.completer, this.cancelToken, this.counter); } Future getThumbnailFromServer(File file) async { @@ -38,27 +39,33 @@ Future getThumbnailFromServer(File file) async { return data; } if (!_map.containsKey(file.uploadedFileID)) { - if (_queue.length == kMaximumConcurrentDownloads) { + if (_queue.length > kMaximumConcurrentDownloads) { final id = _queue.removeFirst(); final item = _map.remove(id); item.cancelToken.cancel(); item.completer.completeError(RequestCancelledError()); } - final item = FileDownloadItem(file, Completer(), CancelToken()); + final item = + FileDownloadItem(file, Completer(), CancelToken(), 1); _map[file.uploadedFileID] = item; _queue.add(file.uploadedFileID); _downloadItem(item); return item.completer.future; } else { + _map[file.uploadedFileID].counter++; return _map[file.uploadedFileID].completer.future; } } void removePendingGetThumbnailRequestIfAny(File file) { if (_map.containsKey(file.uploadedFileID)) { - final item = _map.remove(file.uploadedFileID); - item.cancelToken.cancel(); - _queue.removeWhere((element) => element == file.uploadedFileID); + final item = _map[file.uploadedFileID]; + item.counter--; + if (item.counter <= 0) { + _map.remove(file.uploadedFileID); + item.cancelToken.cancel(); + _queue.removeWhere((element) => element == file.uploadedFileID); + } } }