Доступ к хранилищу данных останавливает выполнение функцииAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Доступ к хранилищу данных останавливает выполнение функции

Сообщение Anonymous »

Я пытаюсь сохранить какое-то простое состояние моего приложения для Android, используя настройки Jetpack DataStore. Я хочу заполнить значение ключа значением по умолчанию, если еще ничего не было сохранено. Однако когда я пытаюсь выяснить, существует ли значение для присутствующего ключа, вызов библиотеки полностью останавливает выполнение всей моей функции.

Код: Выделить всё

package com.example.spielwiese

import android.content.Context
import android.os.Bundle
import android.util.Log
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.stringSetPreferencesKey
import androidx.datastore.preferences.preferencesDataStore
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.count
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext

val Context.dataStore: DataStore
 by preferencesDataStore("settings")

class MainActivity : AppCompatActivity() {
private val scopeIo = CoroutineScope(Job() + Dispatchers.IO)

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContentView(R.layout.activity_main)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}

scopeIo.launch { checkPreferences() }
}

private suspend fun checkPreferences() = withContext(Dispatchers.IO) {
Log.d("HUGELBUGEL", "Before dataStore access.")

val nothingThere = dataStore.data.map { preferences ->
preferences[stringSetPreferencesKey("myKey")]
}.count() == 0

// This log doesn't come out
Log.d("HUGELBUGEL", "After dataStore access: $nothingThere")

// if (nothingThere) putDefaultValueIntoDataStore()
}
}
Первый журнал появляется во время выполнения, а второй — нет. Я пытался его отладить, но когда дело доходит до вызова count(), он просто никогда не возвращается. Я даже не знаю, что здесь происходит. Нет никакого исключения (я пытался его поймать), нет ничего, там просто останавливается выполнение. Возможно, я недостаточно хорошо разбираюсь в сопрограммах Kotlin, но даже тогда: почему он просто останавливает выполнение и не генерирует там исключение? Я неправильно использовал DataStore? Что я могу сделать, чтобы это исправить?
Мой build.gradly.kts для модуля приложения выглядит следующим образом:

Код: Выделить всё

plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.android)
}

android {
namespace = "com.example.spielwiese"
compileSdk = 34

defaultConfig {
applicationId = "com.example.spielwiese"
minSdk = 24
targetSdk = 34
versionCode = 1
versionName = "1.0"

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}

buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
}

dependencies {

implementation(libs.androidx.core.ktx)
implementation(libs.androidx.appcompat)
implementation(libs.material)
implementation(libs.androidx.activity)
implementation(libs.androidx.constraintlayout)
implementation(libs.androidx.datastore.preferences)
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
}
Это все по умолчанию, которые AndroidStudio создает для вас при создании нового проекта, просто добавил сюда необходимый код для вопроса.

Подробнее здесь: https://stackoverflow.com/questions/791 ... -execution
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»