]> uap-core.de Git - rssreader.git/commitdiff
move DB operations for loading feed items to background threads
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Fri, 29 Aug 2025 18:12:11 +0000 (20:12 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Fri, 29 Aug 2025 18:12:11 +0000 (20:12 +0200)
rss-application/src/main/kotlin/de/unixwork/rssreader/FeedCollection.kt
rss-application/src/main/kotlin/de/unixwork/rssreader/FeedList.kt

index 29c14b9b22716d102cd756d42b475e7f5af13d63..022d9a546f3593cccb6d44b28e19cded09f188f8 100644 (file)
@@ -7,4 +7,5 @@ class FeedCollection(id: Int, name: String)  {
     val name = name
     var items = mutableListOf<Item>()
     var itemsLoaded = false
+    var itemsLoading = false
 }
\ No newline at end of file
index 31cc8d7fb318f24cfd1df0e841deb799ea0c92f2..d7bff024bcf819122468a6bebfa24b63bc51d432 100644 (file)
@@ -2,6 +2,11 @@ package de.unixwork.rssreader
 
 import de.unixwork.ui.Document
 import de.unixwork.ui.UiLinkData
+import de.unixwork.ui.kotlin.ToolkitDispatcher
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.IO
+import kotlinx.coroutines.launch
 
 class FeedList : Document() {
     val items = list<Item>("items")
@@ -12,14 +17,37 @@ class FeedList : Document() {
     val webview = webview("webview")
     val tabview = integer("tabview")
 
+    // Feed that is currently shown
     var currentFeed: FeedCollection? = null
+    // Currently requested feed
+    var showFeed: FeedCollection? = null
 
     fun loadFeed(feed: FeedCollection) {
-        items.clear()
+        showFeed = feed
         if(!feed.itemsLoaded) {
-            feed.items = Database.getItems(feed, 10000)
-            feed.itemsLoaded = true
+            if(feed.itemsLoading) {
+                return // another loading job already in progress for this feed
+            }
+
+            feed.itemsLoading = true
+            GlobalScope.launch(Dispatchers.IO) {
+                feed.items = Database.getItems(feed, 10000)
+                feed.itemsLoaded = true
+                // notify UI
+                GlobalScope.launch(ToolkitDispatcher) {
+                    feed.itemsLoading = false
+                    feed.itemsLoaded = true
+                    if(showFeed == feed) {
+                        loadFeed(feed)
+                    }
+                }
+            }
+            return
+
         }
+
+        // Update item list
+        items.clear()
         feed.items.forEach { item ->
             items.add(item)
         }