Android:通过异步 Worker 更改 TextView class

Android: Change TextView via async Worker class

我正在尝试使用 WorkManagerWorker classes 在 android 中尝试异步编程通过让工作人员更改 MainActivity 的视图(而不是在 MainActivity 本身上进行)。这是我的 MainActivity 代码:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)


        val myWorkRequest: WorkRequest =
            OneTimeWorkRequestBuilder<myWorker>()
                .build()

        WorkManager
            .getInstance(this)
            .enqueue(myWorkRequest)


    }

这是我的 Worker 的代码 class:

class myWorker(appContext: Context, workerParams: WorkerParameters, mainView: View): Worker(appContext, workerParams) {
    private val ctx = appContext
    private val view = mainView
    override fun doWork(): Result {
        // Do the work here
        myWork()

        // Indicate whether the work finished successfully with the Result
        return Result.success()

    }
    fun myWork(): Boolean{
        val textView2: TextView = view.findViewById(R.id.textView2)
        textView2.setText("TEST!")
        return true;
    }
}

我很确定问题出在将参数传递给 myWorker,我不太明白我应该如何以及究竟应该将什么传递给 Worker class为了让它影响MainActivity。

您没有将 View 传递给工人 Class。绝不! .这可能会导致某些问题,例如 NPE 和内存泄漏..

现在谈到第二个问题您通常不使用 WorkManager 进行异步编程。 WorkManager 更适合你将来想做的计划任务,它可能会被推迟。这更常被称为后台任务(基本上是在应用程序未打开时)。看看 and This thread .

如果你想要一些异步操作,你基本上有两个广泛使用的选项 CoroutinesRxjava 。由于您已经在使用 kotlin,因此您可以使用 Coroutines,而且它易于实施。

现在,如果您想从 Worker 向 UI 组件提供回调,您可以按照 This .

通常情况下,如果您的异步任务是即时任务,则您不会使用 Worker,在这种情况下您会使用 ThreadCoroutines 是一个多线程框架,因此您可以使用它。