如何从Worker获取输出数据?(MVVM+工作经理+房间)



我正在使用MVVM,并将工作人员从我的存储库中排队。workers的工作只是将一些数据插入数据库,但我希望在后台任务完成后访问一些输出数据,这样我就可以验证数据是否进入数据库而不会出现问题。我尝试使用WorkInfo.State或使用getOutputData获取数据,但由于某种原因,它似乎不起作用。关于我如何做到这一点,有什么想法吗?

这是供参考的代码:

AddWorkoutWorker.java

public class AddWorkoutWorker extends Worker {
public static final String WORK_WORKOUT_NAME = "workout";
public static final String WORK_WORKOUT_TYPE = "type";
public static final String WORK_FAILURE_TAG = "failed";
public static final String WORK_SUCCESS_TAG = "success";
private static final String WORKER_TAG = "Worker Tag";
private WorkoutDAO workoutDAO;
private AppDatabase database;
Boolean workSuccess;
//Worker constructor
public AddWorkoutWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
database = AppDatabase.getInstance(context);
workoutDAO = database.workoutDAO();
}
@NonNull
@Override
public Result doWork() {
//Gets input data
Data inputData = getInputData();
String workoutName = inputData.getString(WORK_WORKOUT_NAME);
String workoutType = inputData.getString(WORK_WORKOUT_TYPE);

if (workoutName != null && workoutType != null){
//Inserts item in database through DAO
Log.d(WORKER_TAG,"Worker data passed: "+workoutName + workoutType);
Workout workout = new Workout(workoutName, workoutType);
workoutDAO.insertSingleWorkout(workout);
}else{
//Returns false if the worker doesn't add the item to the database
workSuccess = false;
Data output = new Data.Builder()
.putBoolean(WORK_FAILURE_TAG,workSuccess)
.build();
return Result.failure(output);
}
//Returns true if the worker adds the item to the database
workSuccess = true;
Data output = new Data.Builder()
.putBoolean(WORK_SUCCESS_TAG, workSuccess)
.build();
return Result.success(output);
}
}

AddWorkoutRepository.java

public class AddWorkoutRepository{
private static final String REPOSITORY_TAG = "REPOSITORY TAG";
public static final String WORKER_QUEUE_TAG = "Importing Single Workout";
public WorkoutDAO workoutDAO;
private final WorkManager workManager;
private AppDatabase database;
//private LiveData<List<Workout>> workouts;

public AddWorkoutRepository(Application application){
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(WORKER_QUEUE_TAG)
.build();
workManager.enqueue(importDataRequest);
Log.d(REPOSITORY_TAG, "After work manager task OK");
}
}

好吧,我想好了。我使用了WorkInfo中提供的LiveData obj来获取输出数据和任务状态。

  1. 我做的第一件事是在ViewModelprivate LiveData<List<WorkInfo>> workerOutPut;中声明LiveData对象
  2. 然后在视图模型构造函数中初始化我的LiveData,如下workerOutPut = workManager.getWorkInfosByTagLiveData(ADD_WORKOUT_WORKER_QUEUE_TAG);
  3. 为LiveData制作了一个getter(当然是在ViewModel中(
  4. 然后,我只是在我的活动中创建了一个Observer,根据我在Worker输出Data中设置的布尔值来检查Worker的状态

就是这样。我是这一切的新手,所以如果有人有什么要添加的,请随时添加。我会发布其他新的"的完整代码;玩家";帮他们一点忙。

Worker.java

public class AddWorkoutWorker extends Worker {
public static final String WORK_WORKOUT_NAME = "workout";
public static final String WORK_WORKOUT_TYPE = "type";
public static final String WORK_FAILURE_TAG = "failed";
public static final String WORK_SUCCESS_TAG = "success";
private static final String ADD_WORKOUT_WORKER_TAG = "Worker Tag";
private WorkoutDAO workoutDAO;
private AppDatabase database;
Boolean workSuccess;
//Worker constructor
public AddWorkoutWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
database = AppDatabase.getInstance(context);
workoutDAO = database.workoutDAO();
}
@NonNull
@Override
public Result doWork() {
//Gets input data
Data inputData = getInputData();
String workoutName = inputData.getString(WORK_WORKOUT_NAME);
String workoutType = inputData.getString(WORK_WORKOUT_TYPE);

if (workoutName != null && workoutType != null){
//Inserts item in database through DAO
Log.d(ADD_WORKOUT_WORKER_TAG,"Worker data passed: "+workoutName + workoutType);
Workout workout = new Workout(workoutName, workoutType);
workoutDAO.insertSingleWorkout(workout);
}else{
//Returns false if the worker doesn't add the item to the database
workSuccess = false;
Data output = new Data.Builder()
.putBoolean(WORK_FAILURE_TAG,workSuccess)
.build();
return Result.failure(output);
}
//Returns true if the worker adds the item to the database
workSuccess = true;
Data output = new Data.Builder()
.putBoolean(WORK_SUCCESS_TAG, workSuccess)
.build();
return Result.success(output);
}
}

ViewModel.java

public class AddWorkoutViewModel extends AndroidViewModel {
private static final String WORKOUT_VIEW_MODEL = "Workout View Model";
private AddWorkoutRepository repository;
private AddWorkoutWorker worker;
private WorkManager workManager;
private Boolean check;
private LiveData<List<WorkInfo>> workerOutPut;
//private LiveData<List<Workout>> AllWorkouts;
public AddWorkoutViewModel(@NonNull Application application) {
super(application);
repository = new AddWorkoutRepository(application);
workManager = WorkManager.getInstance(application);
workerOutPut = workManager.getWorkInfosByTagLiveData(ADD_WORKOUT_WORKER_QUEUE_TAG);
//AllWorkouts = repository.getAllWorkouts();
}

/*public LiveData<List<Workout>> getWorkoutList(){
return AllWorkouts;
}*/
public LiveData<List<WorkInfo>> checkWorkerStatus(){
return workerOutPut;
}
public void insertData(Workout workout){
Log.d(WORKOUT_VIEW_MODEL,"View Model Insert Data");
repository.insertWorkout(workout);
}
}

活动内部的观察者

//Observes LiveData from WorkManager AddWorkoutWorker to validate if worker functioned correctly
mAddWorkoutViewModel.checkWorkerStatus().observe(this, new Observer<List<WorkInfo>>() {
@Override
public void onChanged(List<WorkInfo> workInfos) {
if(workInfos.isEmpty() || workInfos == null){
Log.d(ADD_WORKOUT_WORKER_EMPTY,"Worker is empty");
}else{
if(workInfos.get(0).getOutputData().getBoolean(WORK_SUCCESS_TAG, false)){
//If works do stuff here
}else{
Toast.makeText(AddWorkoutActivity.this,"Something went wrong. Try again.",Toast.LENGTH_LONG);
}
}
}
});

对于那些想知道的人来说。我使用workInfos.get(0(,因为我们只检查一个工人。我想,如果我们同时有多个工人,我们可以为每个人提出一个理由。

最新更新