当前位置: 首页 > 知识库问答 >
问题:

人造人。无法实例化工作线程

施同
2023-03-14

我想从assets文件夹中的json文件预填充我的Room数据库。我遵循谷歌向日葵样本。我复制了SeedDatabaseWorker类:

import android.content.Context
import android.util.Log
import androidx.work.Worker
import androidx.work.WorkerParameters
import com.dmitrysimakov.gymlab.data.GymLabDb
import com.dmitrysimakov.gymlab.data.entity.Training
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.google.gson.stream.JsonReader
import javax.inject.Inject

class SeedDatabaseWorker(val context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {
    private val TAG = SeedDatabaseWorker::class.java.simpleName

    @Inject lateinit var database: GymLabDb

    override fun doWork(): Worker.Result {
        val plantType = object : TypeToken<List<Training>>() {}.type
        var jsonReader: JsonReader? = null

        return try {
            val inputStream = context.assets.open("training.json")
            jsonReader = JsonReader(inputStream.reader())
            val plantList: List<Training> = Gson().fromJson(jsonReader, plantType)
            database.trainingDao().insert(plantList)
            Worker.Result.SUCCESS
        } catch (ex: Exception) {
            Log.e(TAG, "Error seeding database", ex)
            Worker.Result.FAILURE
        } finally {
            jsonReader?.close()
        }
    }
}

我使用的是Dagger 2,所以不是这样做:向日葵AppDatabase,而是这样做:

import android.arch.persistence.db.SupportSQLiteDatabase
import android.arch.persistence.room.Room
import android.arch.persistence.room.RoomDatabase
import androidx.work.OneTimeWorkRequestBuilder
import androidx.work.WorkManager
import com.dmitrysimakov.gymlab.GymLabApp
import com.dmitrysimakov.gymlab.data.GymLabDb
import com.dmitrysimakov.gymlab.workers.SeedDatabaseWorker
import dagger.Module
import dagger.Provides
import javax.inject.Singleton

@Module(includes = [ViewModelModule::class])
class AppModule {

    @Singleton
    @Provides
    fun provideDb(app: GymLabApp): GymLabDb {
        return Room
                .databaseBuilder(app, GymLabDb::class.java, "gymlab.db")
                .addCallback(object : RoomDatabase.Callback() {
                    override fun onCreate(db: SupportSQLiteDatabase) {
                        super.onCreate(db)
                        val request = OneTimeWorkRequestBuilder<SeedDatabaseWorker>().build()
                        WorkManager.getInstance().enqueue(request)
                    }
                })
                .fallbackToDestructiveMigration()
                .build()
    }

    @Singleton
    @Provides
    fun provideTrainingDao(db: GymLabDb) = db.trainingDao()
}

但我无法注入尚未创建的数据库。那么,我怎样才能访问dao?

共有2个答案

曾承弼
2023-03-14

您的问题是SeedDatabase aseWorker仍然基于现在已弃用的Worker(),因此您需要使用Worker(Context, WorkerParameter)此构造函数。

检查我在另一篇文章中的回答,它将帮助你理解< code>WorkManager库。

你现在可以从向日葵演示中检查工人,它已经更新了。

万俟飞语
2023-03-14

问题是我无法将数据库注入 Worker。我在这里找到了解决方案:AndroidWorkerInjection。

 类似资料:
  • 问题内容: 我有一个运行Django应用程序的dockerized设置,在其中使用Celery任务。celery使用Redis作为经纪人。 版本控制: Docker版本17.09.0-CE,构建afdb6d4 docker-compose版本1.15.0,构建e12f3b9 的Django = = 1.9.6 django-celery-beat == 1.0.1 celery== 4.1.0 c

  • 我正在为我的项目使用android应用程序启动,柄和空间。尝试将工作排入队列时出现错误: 我的应用程序类: 我的工作人员: 最后,我对工作和刀柄的依赖关系:def hilt_version=‘2.41’def work_version=‘2.7.1’implementation“com.google.dagger:刀柄android:$hilt_version”kapt“com.gougle.da

  • 问题内容: 我有这段代码,我想浏览页面底部所有可用的链接。单击它们后,我要确保打开的URL是正确的。我认为递归调用还为时过早。另一个问题是如何判断链接属于某个URL。 问题答案: 嗯,看来您几天前就受够了。我建议您使用page-object,它将帮助您避免使用硬代码,并在将来更轻松地更改css。 主页对象(home.js)可能像这样: 并且在您的测试中应该像: PS:如果您不知道如何创建页面对象,

  • 问题内容: 我试过在Windows 7上安装docker(使用boot2docker)。但是控制台只是突然存在,我看不到错误,更不用说运行任何命令了。 在安装过程中,我尝试安装和不安装VirtualBox。我也尝试卸载并重新安装docker和virtualbox。似乎没有任何作用。 这是我运行时看到的控制台错误: 问题答案: 请检查您的BIOS的VT-x设置。根据您提供的日志,有一个错误:

  • 我已经使用reactor-kafka(kafka的一个功能性Java API)创建了一个KafkaProducer(reactor.kafka.sender.KafkaSender)。使用以下生产者配置, 当我试图发布一个记录到一个无效的主题我得到超时异常 正如所料。但我已经为没有发生的重试进行了配置。我假设在/已过期,每次直到或

  • 本文向大家介绍python人人网登录应用实例,包括了python人人网登录应用实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python人人网登录应用的实现方法,分享给大家供大家参考。 具体方法如下: 希望本文所述对大家的Python程序设计有所帮助。

  • 问题内容: 我正在尝试从Oracle网站[fxml教程](http://docs.oracle.com/javase/8/javafx/get-started- tutorial/fxml_tutorial.htm )上的JavaFX教程。 这是我不断得到的例外。该应用程序未显示在屏幕上。我从另一个堆栈溢出答案中完成了非args Main()构造函数,但没有解决。 问题答案: 缺少初始关键字。 也

  • 我已经为graphqlapi(springboot2、graphqlsspringbootstarter、GraphiQL)建立了一个工作设置。 然后,我尝试引入由graphql java扩展标量库提供的自定义标量(在本例中,是类型为java.time.LocalDate的成员的DateScalar): 我在模式中声明了自定义标量和类型, 我提供了作为Springbean(否则服务器无法启动):