【问题标题】:Workmanager Worker class doWork() method not being calledWorkmanager Worker 类 doWork() 方法未被调用
【发布时间】:2019-08-19 11:27:05
【问题描述】:

doWork() 在 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.")
                        }
                    }
                })
        }
    }
}

【问题讨论】:

  • 是正在打印的日志Log.e("inDo", "work")
  • @ManojPerumarath 先生 Log.e() 中没有打印任何内容,即使调试器也无法正常工作
  • 尝试从构造函数中移除val authRepository: AuthRepository参数。
  • @J.D.1731 是的,它采用 doWork 方法,但我想用这种方法将数据发布到服务器。我正在使用 MVVM 模式,我需要 authRespository 类来实现 Web 服务
  • 使用任何其他方式提供依赖,构造函数必须没有任何附加参数。如果您使用任何 DI 库,那么不幸的是,您最终会为您的 Worker 提供工厂,参考:android.jlelse.eu/…

标签: android kotlin android-workmanager


【解决方案1】:

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

请注意,Worker.doWork() 是一个同步调用 - 您应该以阻塞方式完成整个后台工作,并在方法退出时完成它。

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

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

【讨论】:

    【解决方案2】:

    检查你是否连接到网络,因为你已经添加了一个约束

    .setRequiredNetworkType(NetworkType.CONNECTED)
    

    还可以尝试检查网络,您可以使用

    val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    val activeNetwork: NetworkInfo? = cm.activeNetworkInfo
    val isConnected: Boolean = activeNetwork?.isConnected == true
    

    最后你已经将你的任务添加为异步,WorkManager 同步工作,尝试改变它。

    【讨论】:

      【解决方案3】:

      Workers 类在构造函数中必须只有两个参数 context: ContextworkerParameters: WorkerParameters

      class UploadWorker (context: Context, workerParameters: WorkerParameters) {..}
      

      在您的情况下,另一个val authRepository: AuthRepository 会破坏您的代码。 要将其他依赖项传递给您的Worker,您可以使用WorkerFactory,详细描述here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-03
        相关资源
        最近更新 更多