经营两个独立的工人

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

我正在尝试运行两个单独的工作程序,当我启动一个工作程序时,我无法启动另一个工作程序。我觉得我可能缺少一些东西来关闭工作人员,让我无法另谋高就。

片段

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();
    }
}
android worker android-workmanager
2个回答
0
投票

可能是您的工作人员Constraint与设备的当前状况不匹配的情况。请检查您的Constraint


0
投票

您的代码在我的测试中工作正常,两个工人都在工作,

从注释中获得的信息,过滤logcat的方法不那么正确,因此您只从一个Worker获取日志,而过滤掉另一个Worker的日志。

这可以通过调试两个doWork()中带有断点的代码来确认。

编辑

OneTimeWorkRequest应该只工作一次,如果您想重复工作,您可以在按钮的回调中实例化OneTimeWorkRequest对象,因此它将是一个具有新工作请求的新对象

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

    WorkManager.getInstance(getActivity()).enqueue(workerOne);
});
© www.soinside.com 2019 - 2024. All rights reserved.