当前位置: 首页 > 知识库问答 >
问题:

有没有办法加入返回协程?

程钧
2023-03-14

我只是想知道我是否有可能返回activePodcastViewData。每当我试图在GlobalScopeactivePodcastViewData.Without调用它时,我都不允许返回,我确实让一切正常工作fine.However我更新了我的存储库,将挂起方法添加到it.Hence我正在获取挂起函数应该只从协程或另一个挂起函数调用。

fun getPodcast(podcastSummaryViewData: PodcastViewModel.PodcastSummaryViewData): PodcastViewData?{ val repo = podcastRepo ?: return null val url = podcastSummaryViewData.url ?: return null

    GlobalScope.launch {
                val podcast = repo.getPodcast(url)
                withContext(Dispatchers.Main) {
                    podcast?.let {
                        it.feedTitle = podcastViewData.name ?: ""
                        it.imageUrl = podcastViewData.imageUrl ?: ""
                        activePodcastViewData = PodcastView(it)
                        activePodcastViewData
                    }
                }
            }
            return null
        }

PodcastRepo{val rssFeedService=RssFeedService.instance

suspend fun getPodcast(url:String):Podcast?{
    rssFeedService.getFeed(url)
    return Podcast(url,"No name","No Desc","No image")
}

共有1个答案

鞠嘉誉
2023-03-14

我不确定我是否正确理解了你,但是如果你想从协程范围内获取activePodcastViewData,你应该使用一些可观察的数据持有者。我将向您展示一个使用LiveData的简单示例。

首先,添加实现:

implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.0"

现在,在您的视图模型中,我们需要创建可变数据来保存和发出我们未来的数据。

val podcastsLiveData by lazy { MutableLiveData<Podcast>() }

这是你的方法:(我不推荐GlobalScope,让我们替换它)

fun getPodcast(podcastSummaryViewData: PodcastViewModel.PodcastSummaryViewData): PodcastViewData? {
    val repo = podcastRepo ?: return null
    val url = podcastSummaryViewData.url ?: return null
    CoroutineScope(Dispatchers.IO).launch {
        val podcast = repo.getPodcast(url)
        withContext(Dispatchers.Main) {
            podcast?.let {
                it.feedTitle = podcastViewData.name ?: ""
                it.imageUrl = podcastViewData.imageUrl ?: ""
                activePodcastViewData = PodcastView(it)
            }
        }
    }
    podcastsLiveData.postValue(activePodcastViewData)
}

如您所见,您的返回null被转换为postValue()。现在,您终于可以从您的活动中观察到这一点:

viewModel.podcastsLiveData.observe(this) {
            val podcast = it
            //Use your data
        }
viewModel.getPodcast()

现在,每次调用viewModel.getPodcast()方法时,都会调用观察中的代码。

我希望我帮助了一些:D人

 类似资料:
  • 问题内容: 我有一个方法返回基类的集合: 由于()的返回类型与方法()的返回类型不匹配,因此无法编译。我理解为什么会这样:由于泛型类型不同,所以两个类之间没有继承关系。 有很多方法可以解决编译器错误,从将方法的返回类型更改为不使用Arrays.asList并将派生对象之一转换为Base。 当解析Arrays.asList调用的通用类型时,有没有办法告诉编译器使用其他但兼容的类型?(我一直在尝试使用

  • 我目前正在尝试返回我刚刚添加到集合中的文档,以便在我的主页上实时显示它。 我遵循了我在这里找到的解决方案:链接到2018年解决方案。但是这个解决方案似乎不适用于最新的node.js和MongoDb版本。 我基本上是在尝试做与那篇文章中的人尝试做的相同的事情,但我得到了以下错误: 这是我的代码供参考:

  • 问题内容: 有没有办法使用泛型说“此方法返回”? 当然,我想在子类中重写此方法,因此声明应与一起使用。 这是一个例子: 根本不起作用:我收到“类型不匹配:无法从Base转换为T”。如果我强制使用强制转换,则覆盖将失败。 问题答案: 不,无法表达这一点。只需声明该方法即可返回类的类型。Java具有协变返回类型,因此无论如何您都可以重写方法以返回更特定的类型。 如果您想为此添加一些标记,则可以随时引入

  • 问题内容: 我是Redis的新手,正在阅读文档,但找不到解决问题的方法。 我有一个包含名称和电话号码的hash,我想获取hash中键的排序列表。 所以我的哈希(电话簿)看起来像这样: 如果我运行,我会得到此信息(密钥将在存储时返回): 我想得到这个(有序键): 我该如何存档?我使用的数据结构正确吗? 问题答案: 您可以使用排序集而不是哈希来实现此目的,并且不需要维护并行列表。全部包含在一个结构中…

  • 我目前正在努力实现一种保护隐私的数据挖掘算法。对于不同各方之间的通信部分,我使用的是Netty 4.0。双方之间的通信流如下所示: 其中是启动和控制整个计算的主方。安全多方乘法的逻辑位于 Netty 中。还有另一种用于安全添加的协议。 目前,我使用类似的解决方案,如Netty核心团队的Norman Maurer所示,以了解子协议计算是否已完成。但这感觉有点像是在对抗框架。 是否有办法从< code

  • 问题内容: 在我的不和谐机器人中,我有2个命令来赋予和创建角色。它们工作得很好,但是如果角色名称包含空格,那么我有问题。它将第二个单词计入第二个参数,使命令产生错误。 理想情况下,我应该能够执行类似的操作,但会收到“无效用户”错误。我有什么办法可以在角色名称中支持空格?提前致谢! 问题答案: 您有几种选择: 使用角色转换器并要求提及角色: 要求角色用引号引起来: 切换两个参数的位置,以使转换后的用