本文介绍了Android WorkManager:无法从PeriodicWorkRequest获取输出数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

由于某些原因,我无法从Android WorkManager的PeriodicWorkRequest获取输出数据.工作程序按预期定期运行,只是不返回任何数据.

For some reasons I cannot get output data from PeriodicWorkRequest of Android WorkManager. The worker runs periodically as expected, it just doesn't return any data.

我的MainActivity:

My MainActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    schedulePeriodicRequests();
}

public void schedulePeriodicRequests() {
    PeriodicWorkRequest workRequest = new PeriodicWorkRequest.Builder(ServerRequestsWorker.class, 15, TimeUnit.MINUTES)
            .build();

    WorkManager workManager = WorkManager.getInstance(MainActivity.this);
    workManager.enqueue(workRequest);
    workManager.getWorkInfoByIdLiveData(workRequest.getId())
            .observe(this, new Observer<WorkInfo>() {
                @Override
                public void onChanged(@Nullable WorkInfo workInfo) {
                    if (workInfo != null) {
                        Log.d(LOG_TAG, "WorkInfo received: state: " + workInfo.getState());
                        String message = workInfo.getOutputData().getString(ServerRequestsWorker.KEY_MESSAGE);
                        Log.d(LOG_TAG, "message: " + message);
                    }
                }
            });
}

我的ServerRequestsWorker:

My ServerRequestsWorker:

public static final String KEY_MESSAGE = "message";

@NonNull
@Override
public Result doWork() {
    Log.d(LOG_TAG, "Worker works");

    Data outputData = new Data.Builder()
            .putString(KEY_MESSAGE, "This is output message")
            .build();

    return Result.success(outputData);
}

workInfo.getOutputData().getString中的值始终为null.这是我在日志中得到的:

The value from workInfo.getOutputData().getString is always null.Here's what I get in the log:

MainActivity: WorkInfo received: state: ENQUEUED
MainActivity: message: null
ServerRequestsWorker: Worker works
WM-WorkerWrapper: Worker result SUCCESS for Work [ id=5f2beba8-c8bf-4f07-b4ee-e876e95d3cdb, tags={ com.anshmidt.pricemonitor.ServerRequestsWorker } ]
MainActivity: WorkInfo received: state: RUNNING
MainActivity: message: null
MainActivity: WorkInfo received: state: ENQUEUED
MainActivity: message: null

有趣的是,从OneTimeWorkRequest获取输出数据工作正常.如果我从PeriodicWorkRequest切换到OneTimeWorkRequest:

It's interesting that getting output data from OneTimeWorkRequest is working fine.If I switch from PeriodicWorkRequest to OneTimeWorkRequest:

    OneTimeWorkRequest serverScraperWorkRequest = new OneTimeWorkRequest.Builder(ServerRequestsWorker.class)
            .build();

    WorkManager workManager = WorkManager.getInstance(MainActivity.this);
    workManager.enqueue(serverScraperWorkRequest);
    workManager.getWorkInfoByIdLiveData(serverScraperWorkRequest.getId())
            .observe(this, new Observer<WorkInfo>() {
                @Override
                public void onChanged(@Nullable WorkInfo workInfo) {
                    if (workInfo != null) {
                        Log.d(LOG_TAG, "WorkInfo received: state: " + workInfo.getState());
                        String message = workInfo.getOutputData().getString(ServerRequestsWorker.KEY_MESSAGE);
                        Log.d(LOG_TAG, "message: " + message);
                    }
                }
            });

,然后我成功地从输出数据中接收了值:

, then I successfully receive the value from output data:

MainActivity: message: This is output message

我尝试加入独特的工作并按标签加入,但是没有运气.尝试过WorkManager 2.2.0和1.x,结果是相同的.

I've tried enqueueing unique work and enqueueing by tag, but no luck.Have tried WorkManager 2.2.0 and 1.x, result is the same.

我错过了什么吗?甚至有可能从PeriodicWorkRequest获取输出数据吗?我怎么了?

Am I missing something? Is it even possible to get output data from PeriodicWorkRequest? What do I wrong?

推荐答案

按照 WorkInfo 文档:

对于定期工作,每次运行都会重复使用相同的ID,这意味着工作永远不会到达 SUCCEEDED -相反,工作会立即转换回 ENQUEUED ,等待用于下一次定期运行.因此,您正在经历的似乎是预期的行为.

For Periodic work, the same ID is reused for each run, meaning that the work never gets to SUCCEEDED - instead, the work transitions immediately back to ENQUEUED, waiting for the next periodic run. Therefore, what you're experiencing seems to be the expected behavior.

如您所见,使用一次工作没有这种行为,因为该工作实际上到达了 SUCCEEDED 且以后每次运行(如果您的一次工作是重新安排同一类型的工作)将有一个新的ID.另一种选择是使用输出数据,而是将定期工作的结果存储在自己的数据库中.

As you've seen, using one time work does not have this behavior, since the work actually gets to SUCCEEDED and each subsequent run (if your one time work were to reschedule the same type work) would have a new ID. The other alternative is to not use output data, but instead store the result of your periodic work in your own database.

这篇关于Android WorkManager:无法从PeriodicWorkRequest获取输出数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-21 10:14