Browse Source

Track counter for fileDownload requests & cancel only when counter <= zero

Neeraj Gupta 4 years ago
parent
commit
2ccdcc4a8a
2 changed files with 15 additions and 8 deletions
  1. 1 1
      lib/ui/thumbnail_widget.dart
  2. 14 7
      lib/utils/thumbnail_util.dart

+ 1 - 1
lib/ui/thumbnail_widget.dart

@@ -85,7 +85,7 @@ class _ThumbnailWidgetState extends State<ThumbnailWidget> {
   @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);

+ 14 - 7
lib/utils/thumbnail_util.dart

@@ -20,14 +20,15 @@ import 'dart:io' as io;
 final _logger = Logger("ThumbnailUtil");
 final _map = LinkedHashMap<int, FileDownloadItem>();
 final _queue = Queue<int>();
-const int kMaximumConcurrentDownloads = 2500;
+const int kMaximumConcurrentDownloads = 500;
 
 class FileDownloadItem {
   final File file;
   final Completer<Uint8List> 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<Uint8List> getThumbnailFromServer(File file) async {
@@ -38,27 +39,33 @@ Future<Uint8List> 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<Uint8List>(), CancelToken());
+    final item =
+        FileDownloadItem(file, Completer<Uint8List>(), 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);
+    }
   }
 }