我应该传递什么上下文 WorkManager.getInstance().enqueue() ? (使用 MVVM + 房间数据库 + WorkManager)
What Context should i pass on WorkManager.getInstance().enqueue() ? (Using MVVM + Room Database + WorkManager)
我正在尝试通过存储库方法让 WorkManager 工作人员排队,以便在我的数据库中插入一些数据,但我似乎无法弄清楚我应该在 getInstance() 中传递哪种类型的上下文。显然,我给出的上下文是错误的,因为我得到了 NullPointerException。我是 Android 开发的新手,上下文的概念可能令人困惑。我已经尝试了一切,但我相信这很简单。我正在使用 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();
}
}
如果需要更多代码,请随时问我。非常感谢您的提前帮助!
你在行 WorkManager.getInstance(worker.getApplicationContext()).enqueue(importDataRequest);
中遇到了 NullPointerException
因为 worker 字段没有初始化,它的默认值为 null。
您不应该在每个 insertWorkout(Workout workout) 方法调用中获取 WorkManager 的实例。而不是将 WorkManager 实例作为依赖项传递给 AddWorkoutRepository 的构造函数。对于上下文,您可以改用 activity 上下文或应用程序上下文。
如果您不喜欢这种方法,可以在 AddWorkoutRepository class 中添加 WorkManager 字段并在 AddWorkoutRepository 构造函数中对其进行初始化,并使用 Application 对象作为上下文。
更新您的 AddWorkoutRepository class:
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");
}
}
我正在尝试通过存储库方法让 WorkManager 工作人员排队,以便在我的数据库中插入一些数据,但我似乎无法弄清楚我应该在 getInstance() 中传递哪种类型的上下文。显然,我给出的上下文是错误的,因为我得到了 NullPointerException。我是 Android 开发的新手,上下文的概念可能令人困惑。我已经尝试了一切,但我相信这很简单。我正在使用 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();
}
}
如果需要更多代码,请随时问我。非常感谢您的提前帮助!
你在行 WorkManager.getInstance(worker.getApplicationContext()).enqueue(importDataRequest);
中遇到了 NullPointerException
因为 worker 字段没有初始化,它的默认值为 null。
您不应该在每个 insertWorkout(Workout workout) 方法调用中获取 WorkManager 的实例。而不是将 WorkManager 实例作为依赖项传递给 AddWorkoutRepository 的构造函数。对于上下文,您可以改用 activity 上下文或应用程序上下文。
如果您不喜欢这种方法,可以在 AddWorkoutRepository class 中添加 WorkManager 字段并在 AddWorkoutRepository 构造函数中对其进行初始化,并使用 Application 对象作为上下文。
更新您的 AddWorkoutRepository class:
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");
}
}