Solving one of the OutOfMemory erros (too many translators instantiated at the same time)
This commit is contained in:
+5
@@ -0,0 +1,5 @@
|
|||||||
|
package com.vitorpamplona.amethyst.service.lang
|
||||||
|
|
||||||
|
object LanguageTranslatorService {
|
||||||
|
fun clear() {}
|
||||||
|
}
|
||||||
@@ -5,7 +5,6 @@ import android.os.StrictMode
|
|||||||
import android.os.StrictMode.ThreadPolicy
|
import android.os.StrictMode.ThreadPolicy
|
||||||
import android.os.StrictMode.VmPolicy
|
import android.os.StrictMode.VmPolicy
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import androidx.media3.common.util.UnstableApi
|
|
||||||
import coil.ImageLoader
|
import coil.ImageLoader
|
||||||
import com.vitorpamplona.amethyst.service.playback.VideoCache
|
import com.vitorpamplona.amethyst.service.playback.VideoCache
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
@@ -13,7 +12,7 @@ import kotlinx.coroutines.GlobalScope
|
|||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlin.time.measureTimedValue
|
import kotlin.time.measureTimedValue
|
||||||
|
|
||||||
@UnstableApi class Amethyst : Application() {
|
class Amethyst : Application() {
|
||||||
val videoCache: VideoCache by lazy {
|
val videoCache: VideoCache by lazy {
|
||||||
val newCache = VideoCache()
|
val newCache = VideoCache()
|
||||||
newCache.initFileCache(instance)
|
newCache.initFileCache(instance)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package com.vitorpamplona.amethyst.service.playback
|
package com.vitorpamplona.amethyst.service.playback
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import androidx.media3.common.util.UnstableApi
|
|
||||||
import androidx.media3.database.StandaloneDatabaseProvider
|
import androidx.media3.database.StandaloneDatabaseProvider
|
||||||
import androidx.media3.datasource.cache.CacheDataSource
|
import androidx.media3.datasource.cache.CacheDataSource
|
||||||
import androidx.media3.datasource.cache.LeastRecentlyUsedCacheEvictor
|
import androidx.media3.datasource.cache.LeastRecentlyUsedCacheEvictor
|
||||||
@@ -10,7 +10,8 @@ import androidx.media3.datasource.okhttp.OkHttpDataSource
|
|||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
@UnstableApi class VideoCache {
|
@SuppressLint("UnsafeOptInUsageError")
|
||||||
|
class VideoCache {
|
||||||
|
|
||||||
var exoPlayerCacheSize: Long = 150 * 1024 * 1024 // 90MB
|
var exoPlayerCacheSize: Long = 150 * 1024 * 1024 // 90MB
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import androidx.lifecycle.viewmodel.compose.viewModel
|
|||||||
import com.vitorpamplona.amethyst.LocalPreferences
|
import com.vitorpamplona.amethyst.LocalPreferences
|
||||||
import com.vitorpamplona.amethyst.ServiceManager
|
import com.vitorpamplona.amethyst.ServiceManager
|
||||||
import com.vitorpamplona.amethyst.service.ExternalSignerUtils
|
import com.vitorpamplona.amethyst.service.ExternalSignerUtils
|
||||||
|
import com.vitorpamplona.amethyst.service.lang.LanguageTranslatorService
|
||||||
import com.vitorpamplona.amethyst.service.notifications.PushNotificationUtils
|
import com.vitorpamplona.amethyst.service.notifications.PushNotificationUtils
|
||||||
import com.vitorpamplona.amethyst.ui.components.DefaultMutedSetting
|
import com.vitorpamplona.amethyst.ui.components.DefaultMutedSetting
|
||||||
import com.vitorpamplona.amethyst.ui.components.keepPlayingMutex
|
import com.vitorpamplona.amethyst.ui.components.keepPlayingMutex
|
||||||
@@ -104,7 +105,9 @@ class MainActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onPause() {
|
override fun onPause() {
|
||||||
|
LanguageTranslatorService.clear()
|
||||||
ServiceManager.cleanObservers()
|
ServiceManager.cleanObservers()
|
||||||
|
|
||||||
// if (BuildConfig.DEBUG) {
|
// if (BuildConfig.DEBUG) {
|
||||||
GlobalScope.launch(Dispatchers.IO) {
|
GlobalScope.launch(Dispatchers.IO) {
|
||||||
debugState(this@MainActivity)
|
debugState(this@MainActivity)
|
||||||
|
|||||||
+9
-4
@@ -24,7 +24,7 @@ data class ResultOrError(
|
|||||||
)
|
)
|
||||||
|
|
||||||
object LanguageTranslatorService {
|
object LanguageTranslatorService {
|
||||||
var executorService = Executors.newScheduledThreadPool(5)
|
var executorService = Executors.newScheduledThreadPool(3)
|
||||||
|
|
||||||
private val options = LanguageIdentificationOptions.Builder().setExecutor(executorService).setConfidenceThreshold(0.6f).build()
|
private val options = LanguageIdentificationOptions.Builder().setExecutor(executorService).setConfidenceThreshold(0.6f).build()
|
||||||
private val languageIdentification = LanguageIdentification.getClient(options)
|
private val languageIdentification = LanguageIdentification.getClient(options)
|
||||||
@@ -32,7 +32,7 @@ object LanguageTranslatorService {
|
|||||||
val tagRegex = Pattern.compile("(nostr:)?@?(nsec1|npub1|nevent1|naddr1|note1|nprofile1|nrelay1)([qpzry9x8gf2tvdw0s3jn54khce6mua7l]+)", Pattern.CASE_INSENSITIVE)
|
val tagRegex = Pattern.compile("(nostr:)?@?(nsec1|npub1|nevent1|naddr1|note1|nprofile1|nrelay1)([qpzry9x8gf2tvdw0s3jn54khce6mua7l]+)", Pattern.CASE_INSENSITIVE)
|
||||||
|
|
||||||
private val translators =
|
private val translators =
|
||||||
object : LruCache<TranslatorOptions, Translator>(20) {
|
object : LruCache<TranslatorOptions, Translator>(3) {
|
||||||
override fun create(options: TranslatorOptions): Translator {
|
override fun create(options: TranslatorOptions): Translator {
|
||||||
return Translation.getClient(options)
|
return Translation.getClient(options)
|
||||||
}
|
}
|
||||||
@@ -47,6 +47,10 @@ object LanguageTranslatorService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun clear() {
|
||||||
|
translators.evictAll()
|
||||||
|
}
|
||||||
|
|
||||||
fun identifyLanguage(text: String): Task<String> {
|
fun identifyLanguage(text: String): Task<String> {
|
||||||
return languageIdentification.identifyLanguage(text)
|
return languageIdentification.identifyLanguage(text)
|
||||||
}
|
}
|
||||||
@@ -61,6 +65,7 @@ object LanguageTranslatorService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
val options = TranslatorOptions.Builder()
|
val options = TranslatorOptions.Builder()
|
||||||
|
.setExecutor(executorService)
|
||||||
.setSourceLanguage(sourceLangCode)
|
.setSourceLanguage(sourceLangCode)
|
||||||
.setTargetLanguage(targetLangCode)
|
.setTargetLanguage(targetLangCode)
|
||||||
.build()
|
.build()
|
||||||
@@ -116,7 +121,7 @@ object LanguageTranslatorService {
|
|||||||
val short = "A$counter"
|
val short = "A$counter"
|
||||||
counter++
|
counter++
|
||||||
returningList.put(short, tag)
|
returningList.put(short, tag)
|
||||||
} catch (e: Exception) {
|
} catch (_: Exception) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return returningList
|
return returningList
|
||||||
@@ -132,7 +137,7 @@ object LanguageTranslatorService {
|
|||||||
val short = "A$counter"
|
val short = "A$counter"
|
||||||
counter++
|
counter++
|
||||||
returningList.put(short, lnInvoice)
|
returningList.put(short, lnInvoice)
|
||||||
} catch (e: Exception) {
|
} catch (_: Exception) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return returningList
|
return returningList
|
||||||
|
|||||||
Reference in New Issue
Block a user