哪个Context将被传递给WorkManager.getInstance()

问题描述 投票:0回答:1

我正在尝试通过存储库方法将 WorkManager 工作人员排入队列,以便在数据库中插入一些数据,但我似乎无法弄清楚应该在 getInstance() 中传递什么类型的上下文。显然我给出的上下文是错误的,因为我收到了 NullPointerException。我是 Android 开发新手,Context 的概念可能会令人困惑。我已经尝试了一切,但我确信这很简单。我正在使用 MVVM(如果我不应该在存储库中将 Worker 排入队列,请告诉我)+ RoomDatabase。

AddWorkoutRepository.java

public class AddWorkoutRepository {

    private static final String REPOSITORY_TAG = "REPOSITORY TAG";
    private AddWorkoutWorker worker;

    private WorkoutDAO workoutDAO;
    //private LiveData<List<Workout>> workouts;

    public AddWorkoutRepository(Application application){

        AppDatabase database = AppDatabase.getInstance(application);
        workoutDAO = database.workoutDAO();
        //workouts = workoutDAO.getAllWorkoutsLiveData();

    }

    /*public LiveData<List<Workout>> getAllWorkouts(){
        return workouts;
    }*/

    public void insertWorkout(Workout workout){

        String workoutName = workout.getWorkoutName();
        String workoutType = workout.getWorkoutType();

        Log.d(REPOSITORY_TAG, "Insert Values passed: "+workoutName + workoutType);

        Data data = new Data.Builder()
                .putString(WORK_WORKOUT_NAME, workoutName)
                .putString(WORK_WORKOUT_TYPE, workoutType)
                .build();

        OneTimeWorkRequest importDataRequest = new OneTimeWorkRequest.Builder(AddWorkoutWorker.class)
                .setInputData(data)
                .addTag("Importing Single Workout" + workoutName + " and " + workoutType)
                .build();

        WorkManager.getInstance(worker.getApplicationContext()).enqueue(importDataRequest);

        Log.d(REPOSITORY_TAG, "After work manager task OK");

    }
}

AddWorkoutWorker.java

public class AddWorkoutWorker extends Worker {

    public static final String WORK_WORKOUT_NAME = "workout";
    public static final String WORK_WORKOUT_TYPE = "type";
    private static final String WORKER_TAG = "Worker Tag";
    private WorkoutDAO workoutDAO;

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

    @NonNull
    @Override
    public Result doWork() {

        Data inputData = getInputData();
        String workoutName = inputData.getString(WORK_WORKOUT_NAME);
        String workoutType = inputData.getString(WORK_WORKOUT_TYPE);

        if (workoutName != null && workoutType != null){
            Log.d(WORKER_TAG,"Worker data passed: "+workoutName + workoutType);
            Workout workout = new Workout(workoutName, workoutType);
            workoutDAO.insertSingleWorkout(workout);
        }else{
            return Result.failure();
        }

        return Result.success();
    }
}

如果需要更多代码,请随时询问我。非常感谢您提前提供的帮助!

java android mvvm android-workmanager android-mvvm
1个回答
1
投票

第 行出现 NullPointerException

WorkManager.getInstance(worker.getApplicationContext()).enqueue(importDataRequest);
因为 worker 字段未初始化,默认值为 null。 您不应该在每个 insertWorkout(Workout锻炼) 方法调用中获取 WorkManager 的实例。而不是将此传递 WorkManager 实例作为 AddWorkoutRepository 构造函数中的依赖项。对于上下文,您可以使用活动上下文或应用程序上下文。 如果您不喜欢这种方法,您可以在 AddWorkoutRepository 类中添加 WorkManager 字段,并在 AddWorkoutRepository 构造函数中初始化它,并使用 Application 对象作为上下文。

更新您的 AddWorkoutRepository 类:

public class AddWorkoutRepository {

private static final String REPOSITORY_TAG = "REPOSITORY TAG";
private static final String WORK_WORKOUT_NAME = "work_name";
private static final String WORK_WORKOUT_TYPE = "work_time";
private final WorkManager workManager;
private AddWorkoutWorker worker;

private WorkoutDAO workoutDAO;
//private LiveData<List<Workout>> workouts;

public AddWorkoutRepository(Application application){

    AppDatabase database = AppDatabase.getInstance(application);
    workoutDAO = database.workoutDAO();
    workManager = WorkManager.getInstance(application.getApplicationContext());
    //workouts = workoutDAO.getAllWorkoutsLiveData();

}

/*public LiveData<List<Workout>> getAllWorkouts(){
    return workouts;
}*/

public void insertWorkout(Workout workout){

    String workoutName = workout.getWorkoutName();
    String workoutType = workout.getWorkoutType();

    Log.d(REPOSITORY_TAG, "Insert Values passed: "+workoutName + workoutType);

    Data data = new Data.Builder()
            .putString(WORK_WORKOUT_NAME, workoutName)
            .putString(WORK_WORKOUT_TYPE, workoutType)
            .build();

    OneTimeWorkRequest importDataRequest = new OneTimeWorkRequest.Builder(AddWorkoutWorker.class)
            .setInputData(data)
            .addTag("Importing Single Workout" + workoutName + " and " + workoutType)
            .build();

    workManager.enqueue(importDataRequest);


    Log.d(REPOSITORY_TAG, "After work manager task OK");

}

}

© www.soinside.com 2019 - 2024. All rights reserved.