android - 未调用 Workmanager Worker 类 doWork() 方法

标签 android kotlin android-workmanager

doWork() worker 类的方法在 Android 中从未调用过

我想在连接互联网时将离线数据与服务器同步

// worker 经理类

class UploadWorker (context: Context, workerParameters: WorkerParameters, val authRepository: AuthRepository): Worker(context,workerParameters) {
    override fun doWork(): Result {
        Log.e("inDo", "work")
        GlobalScope.launch {
            val resource = authRepository.loginAsync("wmwdwnd@gmail.com", "sdnwnd").await()
            when (resource) {
                is Resource.Success -> {
                    Result.success()
                    Log.e("complete", "ass")
                }
                is Resource.Error -> {
                    Result.success()
                    Log.e("error", "asdd")
                    //when (resource.code) {}
                }
                else -> {
                    Result.success()
                }
            }
        }
        return Result.success()
    }
}

//查看类

class WorkMnagerActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_work_mnager)
        val button = findViewById<Button>(R.id.button2)
        button.setOnClickListener {
            val constraints = Constraints.Builder()
                .setRequiredNetworkType(NetworkType.CONNECTED)
                .build()
            val data = Data.Builder()
                .putString("tittle", "")
                .build()
            val oneTimeWorkRequest = OneTimeWorkRequest.Builder(UploadWorker::class.java)
                .setInputData(data)
                .setConstraints(constraints)
                .build()


            WorkManager.getInstance().enqueue(oneTimeWorkRequest);
            WorkManager.getInstance().getWorkInfoByIdLiveData(oneTimeWorkRequest.id)
                .observe(this, Observer {
                    it?.let {
                        if (it.state == WorkInfo.State.ENQUEUED) {
                            // Show the work state in text view
                            Log.e("ddd","Download enqueued.")
                        } else if (it.state == WorkInfo.State.BLOCKED) {
                            Log.e("ddd","Download blocked")
                        } else  {
                            Log.e("ddd","Download running.")
                        }
                    }
                })
        }
    }
}

最佳答案

worker 类仅支持同步任务(WorkManager 负责在后台执行程序上启动 doWork()。来自 Threading in Worker:

Note that Worker.doWork() is a synchronous call - you are expected to do the entirety of your background work in a blocking fashion and finish it by the time the method exits.

如果您需要异步运行某些东西,我建议您使用 CoroutineWorkerListenableWorker

您可以在 Threading in WorkManager guide 上找到更多信息.

关于android - 未调用 Workmanager Worker 类 doWork() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57555813/

相关文章:

android - 终止应用程序后我的工作经理不工作

android - 水平滚动页面中的水平 ScrollView

android - Worker 类内部调用 BroadcastReceiver 类

android - 安卓用openssl交叉编译c程序

android - 在Kotlin中使用itext5将表添加到现有PDF

机器人 Kotlin : locale des not change after back press

android - 如何使用 Kotlin 同时定位 JVM/Native 和 Android

android-workmanager - 当 onStopped 是 final 时,如何在我的 CoroutineWorker 中执行清理代码?

android - 使用启用了快速滚动的 ListView 时,如何更改字母弹出窗口的文本颜色?

java - 无法构建库项目 Bintray Gradle - ClassNotFoundException