Răsfoiți Sursa

android: Move game deserialization to another thread

Deserializing games from the cache in shared preferences was done on the main thread and could cause a stutter on startup.
Charles Lombardo 2 ani în urmă
părinte
comite
2581590023

+ 23 - 16
src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GamesViewModel.kt

@@ -49,26 +49,33 @@ class GamesViewModel : ViewModel() {
         // Retrieve list of cached games
         val storedGames = PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext)
             .getStringSet(GameHelper.KEY_GAMES, emptySet())
-        if (storedGames!!.isNotEmpty()) {
-            val deserializedGames = mutableSetOf<Game>()
-            storedGames.forEach {
-                val game: Game
-                try {
-                    game = Json.decodeFromString(it)
-                } catch (e: MissingFieldException) {
-                    return@forEach
-                }
 
-                val gameExists =
-                    DocumentFile.fromSingleUri(YuzuApplication.appContext, Uri.parse(game.path))
-                        ?.exists()
-                if (gameExists == true) {
-                    deserializedGames.add(game)
+        viewModelScope.launch {
+            withContext(Dispatchers.IO) {
+                if (storedGames!!.isNotEmpty()) {
+                    val deserializedGames = mutableSetOf<Game>()
+                    storedGames.forEach {
+                        val game: Game
+                        try {
+                            game = Json.decodeFromString(it)
+                        } catch (e: MissingFieldException) {
+                            return@forEach
+                        }
+
+                        val gameExists =
+                            DocumentFile.fromSingleUri(
+                                YuzuApplication.appContext,
+                                Uri.parse(game.path)
+                            )?.exists()
+                        if (gameExists == true) {
+                            deserializedGames.add(game)
+                        }
+                    }
+                    setGames(deserializedGames.toList())
                 }
+                reloadGames(false)
             }
-            setGames(deserializedGames.toList())
         }
-        reloadGames(false)
     }
 
     fun setGames(games: List<Game>) {