perf(android): батарея и плавность — gate FFT, изоляция рекомпозиции, поллинг на паузе
- AudioSpectrumAnalyzer: FFT считается ТОЛЬКО когда открыт плеер (флаг active); раньше ~86 FFT/с молотили всегда при проигрывании (даже экран выкл) — главный пожиратель батареи. Включается из VisualizerHost через DisposableEffect. - Спектр (45/с) собирается в leaf VisualizerHost, а не на верху PlayerBottomSheet — весь плеер больше не рекомпозится 45 раз/сек. - now-playing поллинг (5с) останавливается на паузе (isPlaying.collectLatest) — раньше на паузе зря дёргали сеть каждые 5с. - PlayerService.onDestroy отменяет serviceScope (singleton-плеер НЕ релизим). - refreshStations (парс ~700 станций + сеть + Room) уведён на Dispatchers.IO с главного потока (jank/ANR на старте). - Coil ImageLoader: память 25% + диск 100МБ (обложки не перекачиваются каждую сессию). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -10,6 +10,8 @@ import com.radiola.data.remote.ApiMapper.toDomain
|
||||
import com.radiola.domain.model.Station
|
||||
import com.radiola.domain.model.StreamQuality
|
||||
import com.radiola.domain.repository.StationRepository
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.withContext
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.asStateFlow
|
||||
@@ -35,9 +37,11 @@ class StationRepositoryImpl @Inject constructor(
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun refreshStations(): Result<Unit> {
|
||||
override suspend fun refreshStations(): Result<Unit> = withContext(Dispatchers.IO) {
|
||||
android.util.Log.d("StationRepo", "refreshStations() called")
|
||||
return try {
|
||||
// Тяжёлый парс stations.json (~700) + сетевые вызовы + запись в Room —
|
||||
// на IO, а не на главном потоке (был риск jank/ANR при холодном старте).
|
||||
try {
|
||||
// 1. Load local stations from assets
|
||||
val localStations = localDataSource.loadStations()
|
||||
android.util.Log.d("StationRepo", "Loaded ${localStations.size} local stations")
|
||||
|
||||
Reference in New Issue
Block a user