web-dev-qa-db-fra.com

Android WorkManager: Impossible d'obtenir les données de sortie de périodiquesWorkRequest

Pour certaines raisons, je ne peux pas obtenir de données de sortie de périodiqueworkRequest de Android WorkManager. Le travailleur fonctionne périodiquement comme prévu, cela ne renvoie pas de données.

Ma maigreactivité:

@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);
                    }
                }
            });
}

Mon ServerReQuestSsssssstsSstsSs:

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);
}

La valeur de workinfo.getoutputdata (). GetString est toujours null. Voici ce que je suis dans le journal:

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

Il est intéressant que Obtenir les données de sortie de OnetimeWorkRequest fonctionne bien. Si je passez de périodiques de travail à 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);
                    }
                }
            });

, alors j'ai reçu avec succès la valeur des données de sortie:

MainActivity: message: This is output message

J'ai essayé d'enroquer un travail unique et d'enroquier par balise, mais pas de chance. Ont essayé Workmanager 2.2.0 et 1.x, le résultat est le même.

Est-ce que je manque quelque chose? Est-il même possible d'obtenir des données de sortie de périodiquesWorkRequest? Qu'est-ce que je me trompe?

11
Target

Selon la WorkInfo documentation :

Notez que la sortie est uniquement disponible pour les états de terminaux ( workinfo.state.suckeded et workinfo.state.failed ).

Pour les travaux périodiques, le même identifiant est réutilisé pour chaque exécution, ce qui signifie que le travail ne passe jamais à SUCCEEDED - à la place, le travail passe immédiatement à ENQUEUED, en attente de la prochaine course périodique. Par conséquent, ce que vous ressentez semble être le comportement attendu.

Comme vous l'avez vu, utiliser un travail de temps n'a pas ce comportement, car le travail passe réellement à SUCCEEDED et chaque exécution ultérieure (si votre travail unique est de reproduire le même type de travail) aurait une nouvelle IDENTIFIANT. L'autre alternative est à non Utilisez des données de sortie, mais stockez plutôt le résultat de votre travail périodique dans votre propre base de données.

4
ianhanniballake