gpt4 book ai didi

multithreading - 强制挂起的函数在一个线程上工作以在后台映射 Realm 对象

转载 作者:行者123 更新时间:2023-12-04 06:53:36 26 4
gpt4 key购买 nike

假设我定期(每 3 秒)需要阅读一些 RealmObject 的列表s 并且我想将这些对象映射到将用于填充列表内容的简单数据对象。

对于那些想知道的人来说,有以下三个原因:

  • 计算 ViewHolder 中 View 的值和行为(可见性,即)的复杂性很大s 在我的情况下
  • 我想用ListAdapter需要提供DiffUtilCallback它将在除 UI 之外的某个其他线程上执行,因此无法在其方法中进行所需的计算,因为它们将在未创建它们的线程中使用。
  • 从 Realm 中删除 View 层的依赖

  • 我不能简单地以基本方式使用协程从一个可用线程跳转到另一个,因为我将(并且我确实)最终收到“Realm 已经关闭”异常。

    我想出的唯一解决方案是使用仅使用一个线程的调度程序 newSingleThreadContext("RealmSingleThreadContext")例如:
    class RealmSingleThreadContext {
    val ctx = NewSingleThreadedContext("RealmSingleThreadContext")

    lateinit var realm : Realm

    init {
    // opening Realm connection for thread "RealmSingleThreadContext"
    GlobalScope.launch(ctx) { realm = Realm.getDefaultInstance() }
    }

    fun close() {
    GlobalScope.launch(ctx) { if (!realm.isClosed()) realm.close() }
    }


    }

    这个类通过 Dagger 作为单例提供,最终,我将有一个线程在后台为整个应用程序进行映射,我的“主” View 模型将调用其 onClosed方法 close()这个类的方法。

    这是我如何使用它:
    class HomeViewModel @Inject constructor(/* other */var realmSingleThreadContext: RealmSingleThreadContext) {

    var topLiveEventsUI: MutableLiveData<List<EventPreviewUI>> = MutableLiveData(listOf())

    fun useRealmInBckg() {
    viewModeScope.launch(realmSingleThreadContext.ctx) {
    topLiveEventsUI.postValue(eventsReadUseCase.getTopLiveEvents()
    .map{ mapper.map(it) }
    }
    }

    }

    唯一的就是函数 newSingleThreadContext(name: String)@ObsoleteCoroutineApi注释,所以这意味着它很快就会被删除。

    我的问题是:除了使用这个过时的 Dispatcher 之外,有人可以提出另一种解决方案吗?

    最佳答案

    从 Java 执行程序制作自己的单线程调度程序非常容易:

    val singleThreadContext = Executors.newSingleThreadExecutor().asCoroutineDispatcher()

    关于multithreading - 强制挂起的函数在一个线程上工作以在后台映射 Realm 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56326441/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com