Android livedata协同程序不观察数据
我在项目中使用MVVM体系结构。当它第一次调用时,它工作正常。但在那之后,它就不起作用了。 这是我的密码Android livedata协同程序不观察数据,android,android-livedata,kotlin-coroutines,coroutine,Android,Android Livedata,Kotlin Coroutines,Coroutine,我在项目中使用MVVM体系结构。当它第一次调用时,它工作正常。但在那之后,它就不起作用了。 这是我的密码 fun loadYgosuData() : LiveData<ArrayList<YgosuData>> { Log.d(TAG, "loadYgosuData()...") return liveData { Log.d(TAG, "liveData Scope running....")
fun loadYgosuData() : LiveData<ArrayList<YgosuData>> {
Log.d(TAG, "loadYgosuData()...")
return liveData {
Log.d(TAG, "liveData Scope running....")
val element = withContext(Dispatchers.IO) {
Jsoup.connect("https://www.ygosu.com/community/real_article")
.get()
.select("div.board_wrap tbody tr")
}
emit(setYgosuData(element))
}
fun loadYgosuData():LiveData{
Log.d(标记“loadYgosuData()…”)
返回实时数据{
Log.d(标记“正在运行的liveData范围…”)
val元素=withContext(Dispatchers.IO){
Jsoup.connect(“https://www.ygosu.com/community/real_article")
.get()
.选择(“分区板/包裹体tr”)
}
发射(setYgosuData(元素))
}
}
fun setYgosuData(tmpDoc:Elements?):数组列表{
var tmpList=ArrayList()
if(tmpDoc!=null){
//Log.d(标签,“元素:$tmpDoc”)
对于(tmpDoc中的e){
var title=e.select(“td.tit a”)
var name=e.select(“td.name a”)
var read=e.select(“td.read”)
var日期=e.select(“td.date”)
var url=e.select(“td.tit a”).attr(“href”).toString()
var tmpYgosuData=YgosuData(
title=title.text(),
name=name.text(),
read=read.text(),
日期=日期。文本(),
url=url
)
tmpList.add(tmpYgosuData)
}
}
Log.d(标记,“여기2${tmpList.toString()}”)
返回tmpList
}
你能帮我吗?
谢谢。来自
liveData构建块充当协同路由和liveData之间的结构化并发原语。当LiveData变为活动状态时,代码块开始执行,当LiveData变为非活动状态时,代码块在可配置的超时后自动取消。如果在完成之前取消,则如果LiveData再次变为活动状态,则会重新启动。如果在上一次运行中成功完成,则不会重新启动。请注意,只有在自动取消时才会重新启动。如果由于任何其他原因(例如引发CancelationException)取消了该块,则不会重新启动该块
这就是你提到的第一次成功的原因
解决方案1:将liveData与
private val body:MutableLiveData=MutableLiveData()
val YgousData=body.switchMap{
实时数据{
Log.d(标记“正在运行的liveData范围…”)
val元素=withContext(Dispatchers.IO){
Jsoup.connect(“https://www.ygosu.com/community/real_article")
.get()
.选择(“分区板/包裹体tr”)
}
发射(setYgosuData(元素))
}
}
趣味调用API(参数:字符串){
body.value=param
}
您可以更改要触发api调用的主体
解决方案2:您可以显式地执行api调用,然后将数据发布到livedata(不使用livedata builder)
liveData构建块充当协同路由和liveData之间的结构化并发原语。当LiveData变为活动状态时,代码块开始执行,当LiveData变为非活动状态时,代码块在可配置的超时后自动取消。如果在完成之前取消,则如果LiveData再次变为活动状态,则会重新启动。如果在上一次运行中成功完成,则不会重新启动。请注意,只有在自动取消时才会重新启动。如果由于任何其他原因(例如引发CancelationException)取消了该块,则不会重新启动该块
这就是你提到的第一次成功的原因
解决方案1:将liveData与
private val body:MutableLiveData=MutableLiveData()
val YgousData=body.switchMap{
实时数据{
Log.d(标记“正在运行的liveData范围…”)
val元素=withContext(Dispatchers.IO){
Jsoup.connect(“https://www.ygosu.com/community/real_article")
.get()
.选择(“分区板/包裹体tr”)
}
发射(setYgosuData(元素))
}
}
趣味调用API(参数:字符串){
body.value=param
}
您可以更改要触发api调用的主体
解决方案2:您可以显式地执行api调用,然后将数据发布到livedata(不使用livedata builder)您可以在调用
LoadyGosData
方法的地方显示代码吗?您可以在调用LoadyGosData
方法的地方显示代码吗?这是我真正想要的。谢谢!这才是我真正想要的。谢谢!
fun setYgosuData(tmpDoc: Elements?) : ArrayList<YgosuData> {
var tmpList = ArrayList<YgosuData>()
if (tmpDoc != null) {
//Log.d(TAG, "element : $tmpDoc")
for (e in tmpDoc) {
var title = e.select("td.tit a")
var name = e.select("td.name a")
var read = e.select("td.read")
var date = e.select("td.date")
var url = e.select("td.tit a").attr("href").toString()
var tmpYgosuData = YgosuData(
title = title.text(),
name = name.text(),
read = read.text(),
date = date.text(),
url = url
)
tmpList.add(tmpYgosuData)
}
}
Log.d(TAG, "여기2 ${tmpList.toString()}")
return tmpList
}
private val body: MutableLiveData<String> = MutableLiveData()
val YgousData = body.switchMap {
liveData {
Log.d(TAG, "liveData Scope running....")
val element = withContext(Dispatchers.IO) {
Jsoup.connect("https://www.ygosu.com/community/real_article")
.get()
.select("div.board_wrap tbody tr")
}
emit(setYgosuData(element))
}
}
fun callApi(param:String){
body.value = param
}