【问题标题】:How to get a Room Database ViewModel instance inside WorkManager?如何在 WorkManager 中获取 Room Database ViewModel 实例?
【发布时间】:2020-06-18 17:35:22
【问题描述】:

我是 Android 开发的新手。我无法获得 在 WorkManager 中扩展 AndroidViewModel 的房间数据库视图模型。我想获得一个视图模型类实例来插入房间数据库。

AppAdViewModel.class

public class AppAdViewModel extends AndroidViewModel {

    private AppAdRepository appAdRepository;

    public AppAdViewModel(@NonNull Application application) {
        super(application);
        appAdRepository = new AppAdRepository(application);
    }

    public void insert(AppAdModel appAdModel){
        appAdRepository.insertAd(appAdModel);
    }

}

MyBackgroundWorker.class

public class AppDataSyncingworker extends Worker{


    private Context context;
    private AppAdViewModel appAdViewModel;

    public AppDataSyncingworker(@NonNull Context context, @NonNull WorkerParameters workerParams){
        super(context, workerParams);
    }

    @NonNull
    @Override
    public Result doWork() {

        this.context = getApplicationContext();
        // error on this line
        this.appAdViewModel = new ViewModelProvider((AppCompatActivity)context).get(AppAdViewModel.class);
        return null;
    }

它显示的错误是:

java.util.concurrent.ExecutionException: java.lang.ClassCastException: android.app.Application cannot be cast to androidx.appcompat.app.AppCompatActivity
        at androidx.work.impl.utils.futures.AbstractFuture.getDoneValue(AbstractFuture.java:516)
        at androidx.work.impl.utils.futures.AbstractFuture.get(AbstractFuture.java:475)
        at androidx.work.impl.WorkerWrapper$2.run(WorkerWrapper.java:298)
        at androidx.work.impl.utils.SerialExecutor$Task.run(SerialExecutor.java:91)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:764)
     Caused by: java.lang.ClassCastException: android.app.Application cannot be cast to androidx.appcompat.app.AppCompatActivity

任何帮助或指导我做错了什么?

【问题讨论】:

    标签: android-room android-viewmodel android-workmanager


    【解决方案1】:

    调用 getApplicationContext() 不应该是获取上下文的首选方式。 Worker 的公共构造函数将 Context 作为第一个参数。你可以使用它

    【讨论】:

    • 是的,我试过了。 this.context = 上下文。然而,它没有成功,伙计!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    • 2019-01-22
    • 2019-08-19
    相关资源
    最近更新 更多