AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 77045368
Accepted
Евгений s
Евгений s
Asked: 2023-09-05 22:24:38 +0800 CST2023-09-05 22:24:38 +0800 CST 2023-09-05 22:24:38 +0800 CST

Por que a função de coleta do Kotlin não termina sozinha?

  • 772

Quando faço download de informações de um banco de dados, a função de coleta não interrompe a emissão (a função de coleta do Kotlin não termina sozinha).

Eu tenho esta classe de entidade:

@Entity
data class ShareEntity(
    @PrimaryKey(autoGenerate = false)
    val secId: String,
    val shortName: String,
    val fullName: String = "",
    val isFavorite: Boolean
)

A função para obter todos os compartilhamentos específicos de “isFavorite” no Dao é assim:

@Dao
interface DataBaseDao {
………..
@Query("SELECT * FROM ShareEntity WHERE isFavorite =:isFavorite")
fun getAllSharesByIsFavorite(isFavorite: Boolean): Flow<List<ShareEntity>>
}

No DataBaseDao existem muitas outras funções que inserem alguns dados na entidade ShareEntity.

Para trabalhar com a interface Dao foi feito o DataBaseRepository e sua implementação DataBaseRepositoryIm:

interface DataBaseRepository {
………..
fun getAllSharesByIsFavorite(isFavorite: Boolean): Flow<List<ShareEntity>>
}
class DataBaseRepositoryIm(
private val dataBaseDao: DataBaseDao
) : DataBaseRepository{
………..
override fun getAllSharesByIsFavorite(isFavorite: Boolean): Flow<List<ShareEntity>> {
 return dataBaseDao.getAllSharesByIsFavorite(isFavorite)
}
}

No meu NewsScreenViewModel1 tenho uma função que carrega todos os compartilhamentos por “isFavorite”

@HiltViewModel
class NewsScreenViewModel1 @Inject constructor(
    private val dataBaseRepository: DataBaseRepository,
    private val repository: ApiRepository,
) : ViewModel(){

suspend fun downloadListOfSharesByIsFavorite(isFavorite: Boolean = true){
 val shares = dataBaseRepository.getAllSharesByIsFavorite(isFavorite).collect{ it:List<ShareEntity> ->
 println("NewsScreenVM1: allShares is with isFavorite = $isFavorite are $it")
 println("NewsScreenVM1: the size of shares is ${it.size}")
 }
 println("NewsScreenVM1: Now we are outside of the collect function")
}
}

No NewsScreen combinável eu inicio a função com LauncheEffect:

@Composable
fun NewsScreen(
    NewsScreenViewModel1: NewsScreenViewModel1 = hiltViewModel()
) {
    LaunchedEffect(key1 = Unit) {
        NewsScreenViewModel1.downloadListOfSharesByIsFavorite()
    }

}

O problema é que a função collect não termina sozinha ou, em outras palavras, não para. No LogCat vejo:

“NewsScreenVM1: allShares está com isFavorite = true são [ShareEntity(secId=ALRS, shortName=АЛРОСА ао, fullName=, isFavorite=true), ShareEntity(secId=AGRO, shortName=AGRO-гдр, fullName=, isFavorite=true), ShareEntity(secId=AFLT, shortName=Аэрофлот, fullName=, isFavorite=true), ShareEntity(secId=FEES, shortName=Россети, fullName=, isFavorite=true)]”

“NewsScreenVM1: o tamanho dos compartilhamentos é 4”

E não há: “NewsScreenVM1: Agora estamos fora da função de coleta”, o que significa que a função de coleta não interrompeu sua emissão e ainda está em execução.

O que eu fiz errado? Por que não consigo executar linhas do código depois de coletar alguns dados do banco de dados?

Tentei executar o fluxo em um escopo de corrotina diferente como este:

fun downloadListOfSharesByIsFavorite(isFavorite: Boolean = true){
 viewModelScope.launch { 
val shares = dataBaseRepository.getAllSharesByIsFavorite(isFavorite).collect{ it:List<ShareEntity> -> 
println("NewsScreenVM1: allShares is with isFavorite = $isFavorite are $it")
println("NewsScreenVM1: the size of shares is ${it.size}")
}
println("NewsScreenVM1: Now we are outside of the collect function")
}
}

Mas a mensagem 'NewsScreenVM1: Agora estamos fora da função de coleta' aparece logo antes de todos os cálculos, o que não é o que eu quero. Quero que seja a última massagem.

Quando uso a função assíncrona com .await() também não recebo a última mensagem, pois o fluxo nunca para. Aqui está o código:

suspend fun downloadListOfSharesByIsFavorite(isFavorite: Boolean = true) {
        val asyncValue = viewModelScope.async {
            var size = 0
            val shares = dataBaseRepository.getAllSharesByIsFavorite(isFavorite)
                .collect { it: List<ShareEntity> ->
                    println("NewsScreenVM1: allShares is with isFavorite = $isFavorite are $it")
                    println("NewsScreenVM1: the size of shares is ${it.size}")
                    size = it.size

                }
            size
        }
            println("NewsScreenVM1: Now we are outside of the collect function. The list size is ${asyncValue.await()}")
        }
kotlin
  • 1 1 respostas
  • 24 Views

1 respostas

  • Voted
  1. Best Answer
    Joffrey
    2023-09-05T22:33:35+08:002023-09-05T22:33:35+08:00

    Esse é o objetivo de usar um arquivo Flow. Não termina porque está aguardando atualizações do banco de dados. Cada vez que a lista for alterada no banco de dados, você obterá a nova lista atualizada no formato collect. Por design, não foi feito para acabar: https://developer.android.com/codelabs/basic-android-kotlin-training-intro-room-flow

    Se o que você deseja é apenas consultar a lista atual uma vez, não há necessidade de Flownem collectchamada. Basta usar uma suspendfunção que retorne um List.

    • 2

relate perguntas

  • Ao usar ?.get para acessar o parâmetro Kotlin gera um erro Referência não resolvida

  • Kotlin - Como processar dados em paralelo corretamente?

  • como combinar anotação e estilo no Compose?

  • Kotlin coleta SharedFlow não está coletando

  • Como usar o filtro de vários termos no Spring Data Elasticsearch?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve