Fixed ANR caused by too many saved games

This commit is contained in:
Yair Morgenstern 2020-12-10 10:42:02 +02:00
parent 4578994adf
commit ab548dda54
2 changed files with 109 additions and 97 deletions

View File

@ -1,10 +1,13 @@
package com.unciv.ui.saves
import com.badlogic.gdx.Gdx
import com.badlogic.gdx.files.FileHandle
import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.scenes.scene2d.actions.Actions
import com.badlogic.gdx.scenes.scene2d.ui.CheckBox
import com.badlogic.gdx.scenes.scene2d.ui.Table
import com.badlogic.gdx.scenes.scene2d.ui.TextButton
import com.badlogic.gdx.utils.Align
import com.unciv.UncivGame
import com.unciv.logic.GameSaver
import com.unciv.logic.UncivShowableException
@ -129,10 +132,31 @@ class LoadGameScreen(previousScreen:CameraStageBaseScreen) : PickerScreen() {
private fun updateLoadableGames(showAutosaves:Boolean) {
saveTable.clear()
for (save in GameSaver.getSaves().sortedByDescending { it.lastModified() }) {
val loadImage =ImageGetter.getImage("OtherIcons/Load")
loadImage.setSize(50f,50f) // So the origin sets correctly
loadImage.setOrigin(Align.center)
loadImage.addAction(Actions.rotateBy(360f, 2f))
saveTable.add(loadImage).size(50f)
thread { // Apparently, even jut getting the list of saves can cause ANRs -
// not sure how many saves these guys had but Google Play reports this to have happened hundreds of times
// .toList() because otherwise the lastModified will only be checked inside the postRunnable
val saves = GameSaver.getSaves().sortedByDescending { it.lastModified() }.toList()
Gdx.app.postRunnable {
saveTable.clear()
for (save in saves) {
if (save.name().startsWith("Autosave") && !showAutosaves) continue
val textButton = TextButton(save.name(), skin)
textButton.onClick {
textButton.onClick { onSaveSelected(save) }
saveTable.add(textButton).pad(5f).row()
}
}
}
}
private fun onSaveSelected(save: FileHandle) {
selectedSave = save.name()
copySavedGameToClipboardButton.enable()
var textToSet = save.name()
@ -159,9 +183,6 @@ class LoadGameScreen(previousScreen:CameraStageBaseScreen) : PickerScreen() {
}
}
}
saveTable.add(textButton).pad(5f).row()
}
}
}

View File

@ -77,7 +77,7 @@ object ImageGetter {
// These are from the mods
for (mod in ruleset.mods) {
val modAtlasFile = Gdx.files.local("mods/$mod/game.atlas")
if (modAtlasFile.exists()) {
if (!modAtlasFile.exists()) continue
val modAtlas = TextureAtlas(modAtlasFile)
for (region in modAtlas.regions) {
val drawable = TextureRegionDrawable(region)
@ -85,7 +85,6 @@ object ImageGetter {
}
}
}
}
/**
@ -142,12 +141,6 @@ object ImageGetter {
return layerList
}
/*fun refreshAtlas() {
atlas.dispose() // To avoid OutOfMemory exceptions
atlas = TextureAtlas("game.atlas")
setTextureRegionDrawables()
}*/
fun getWhiteDot() = getImage(whiteDotLocation)
fun getDot(dotColor: Color) = getWhiteDot().apply { color = dotColor }
@ -192,8 +185,7 @@ object ImageGetter {
cityStateIcon.color = nation.getInnerColor()
return cityStateIcon.surroundWithCircle(size * 0.9f).apply { circle.color = nation.getOuterColor() }
.surroundWithCircle(size, false).apply { circle.color = nation.getInnerColor() }
}
else{
} else {
return getCircle().apply { color = nation.getOuterColor() }
.surroundWithCircle(size).apply { circle.color = nation.getInnerColor() }
@ -385,4 +377,3 @@ object ImageGetter {
return specialist
}
}