【问题标题】:CoroutineLiveData emits nullCoroutineLiveData 发出 null
【发布时间】:2020-10-25 19:15:53
【问题描述】:

我正在学习 Android LiveData。我有代码

    private lateinit var questionCounterTotal: LiveData<Int>

在片段的onCreateView:

questionList = questionViewModel.getAllQuestions()
questionCounterTotal = liveData { emit(44) }

//this line prints null 
questionCounterTotal.observe(viewLifecycleOwner,Observer<Int>{value->
    Log.d("amin",value.toString())
})

//this line prints null too
Log.d("amin",questionCounterTotal.value.toString())

正如 cmets 所描述的,当代码托管在 Fragment 中时,我无法打印 questionCouterTotal 值,但如果代码位于 Activity 内部,则代码可以正常工作>。我做错了什么?

【问题讨论】:

    标签: android kotlin android-livedata kotlin-coroutines


    【解决方案1】:

    这是因为 LiveData 值在其观察者处于活动状态之前不会发出。来自documentation:

    LiveData 认为观察者(由 Observer 类表示)如果其生命周期处于 STARTED 或 RESUMED 状态,则它处于活动状态。

    让我添加额外的日志来证明上述内容。

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
    
        val questionCounterTotal = liveData {
            Log.d("amin", "Emitting 44")
            emit(44)
        }
        Log.d("amin", "The line after liveData { }")
    
        questionCounterTotal.observe(viewLifecycleOwner, Observer<Int>{ value->
            Log.d("amin","Observing value: $value")
        })
    
        Log.d("amin", "onViewCreated: ${questionCounterTotal.value.toString()}")
    }
    
    override fun onStart() {
        super.onStart()
        Log.d("amin", "onStart")
    }
    

    给出以下输出:

    D/amin: The line after liveData { }
    D/amin: onViewCreated: null
    D/amin: onStart
    D/amin: Emitting 44
    D/amin: Observing value: 44
    

    【讨论】:

    • 谢谢。如果没有观察者呢?它会在 livedata builder 中运行Log.d("amin", "Emitting 44") 吗?
    猜你喜欢
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多