Запуск двух отдельных рабочих - PullRequest
1 голос
/ 10 января 2020

Я пытаюсь запустить двух отдельных работников. Когда я запускаю одного работника, я не могу запустить другого работника. Я чувствую, что могу что-то упустить, чтобы закрыть работника, позволяющего запустить другого работника.

Фрагмент

Constraints myConstrainst = new Constraints.Builder()
    .setRequiredNetworkType(NetworkType.UNMETERED)
    .build();

OneTimeWorkRequest workerOne = new OneTimeWorkRequest.Builder(WorkerOne.class)
    .setConstraints(myConstraints)
    .addTag("WorkerOne")
    .build();

OneTImeWorkRequest workerTwo = new OneTimeWorkRequest.Builder(WorkerTwo.class)
    .setConstraints(myConstrains)
    .addTag("WorkerTwo")
    .build();

btnOne.setOnClickListener(view -> {
    WorkMananger.getInstance(getActivity()).enqueue(workerOne);
});

btnTwo.setOnClickListener(view -> {
    WorkManager.getInstance(getActivity()).enqueue(workerTwo);
});

WorkerOne

public class WorkerOne extends Worker {
    public WorkerOne(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }

    @Override
    public Result doWork() {
        for(int i = 0; i < 5; i++) {
            Log.d("WorkerOne", "doWork " + i);
            SystemClock.sleep(1000);
        }
        return Result.success();
    }
}

WorkerTwo

public class WorkerTwo extends Worker {
    public WorkerTwo(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }

    @Override
    public Result doWork() {
        for(int i = 0; i < 5; i++) {
            Log.d("WorkerTwo", "doWork " + i);
            SystemClock.sleep(1000);
        }
        return Result.success();
    }
}

Ответы [ 2 ]

1 голос
/ 10 января 2020

Ваш код отлично работает с моим тестом, оба работника выполняют свою работу,

Как видно из комментариев, фильтрация logcat не совсем подходит, так что вы просто получаете журналы от одного работника, а отфильтровывает журнал другого работника.

Это может быть подтверждено кодом отладки с точками останова в обоих doWork ().

EDIT

Это запрос комментариев, не относящихся к вопросу

Я нажимаю btnOne, чтобы запустить workerOne, и жду, пока работа завершится sh. Если я нажму btnOne второй раз, ничего не произойдет

OneTimeWorkRequest должен работать только один раз, если вы хотите повторить работу, вы можете создать экземпляр объекта OneTimeWorkRequest в обратном вызове вашей кнопки, так что это будет новый объект с новым рабочим запросом

btnOne.setOnClickListener(view -> {
    OneTimeWorkRequest workerOne = new OneTimeWorkRequest.Builder(WorkerOne.class)
            .setConstraints(myConstraints)
            .addTag("WorkerOne")
            .build();

    WorkManager.getInstance(getActivity()).enqueue(workerOne);
});
0 голосов
/ 10 января 2020

Возможно, ваш работник Constraint не соответствует текущему состоянию вашего устройства. Пожалуйста, проверьте ваш Constraint.

...