Android:通过异步 Worker 更改 TextView class
Android: Change TextView via async Worker class
我正在尝试使用 WorkManager 和 Worker 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 .
如果你想要一些异步操作,你基本上有两个广泛使用的选项 Coroutines
和 Rxjava
。由于您已经在使用 kotlin
,因此您可以使用 Coroutines
,而且它易于实施。
现在,如果您想从 Worker
向 UI 组件提供回调,您可以按照 This .
通常情况下,如果您的异步任务是即时任务,则您不会使用 Worker
,在这种情况下您会使用 Thread
。 Coroutines
是一个多线程框架,因此您可以使用它。
我正在尝试使用 WorkManager 和 Worker 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
更适合你将来想做的计划任务,它可能会被推迟。这更常被称为后台任务(基本上是在应用程序未打开时)。看看
如果你想要一些异步操作,你基本上有两个广泛使用的选项 Coroutines
和 Rxjava
。由于您已经在使用 kotlin
,因此您可以使用 Coroutines
,而且它易于实施。
现在,如果您想从 Worker
向 UI 组件提供回调,您可以按照 This .
通常情况下,如果您的异步任务是即时任务,则您不会使用 Worker
,在这种情况下您会使用 Thread
。 Coroutines
是一个多线程框架,因此您可以使用它。