5
votes

Comment réduire la durée de PeriodicWorkManager dans WorkManager

Dans PeriodicTimeRequest , le temps périodique minimum est de 15 minutes. Je souhaite le réduire de 15 minutes à moins de 15 minutes, comment puis-je faire cela?


6 commentaires

Vous ne pouvez pas. Si vous pouviez, ils ne diraient pas que 15 minutes est le minimum. Je ne sais pas ce que vous voulez faire mais WorkManager n'est probablement pas adapté à votre objectif et devrait trouver un autre moyen de le faire.


@Alan Quelle API je dois utiliser pour réduire une période de temps de tarte Android de moins de 15 minutes. J'implémente également l'API JobScheduler mais ne fonctionne pas. Si vous avez une solution, dites-moi


Vous ne donnez pas assez d'informations sur le problème plus large que vous essayez de résoudre et ne me demandez pas de le résoudre. Si vous voulez de bonnes réponses, vous devez d'abord poser de bonnes questions. Tout ce que je peux dire, c'est que si vous devez effectuer un travail périodique qui se répète en moins de 15 minutes, WorkManager ou JobScheduler n'est pas la bonne approche. Vous pouvez essayer d'utiliser AlarmManager mais cela ne fonctionne pas lorsque l'appareil est en mode veille. Tout dépend du problème plus large que vous essayez de résoudre.


@ Alan Actuellement, je travaille sur une application Android si un changement se produit côté serveur, puis une notification immédiate s'affiche si l'application Android ne fonctionne pas


Veuillez accepter ma réponse. Regardez le lien et recherchez plus d'informations si nécessaire. À moins que vous n'ayez encore des questions sur la période de planification minimale du gestionnaire de travail, vous ne devriez pas poser de nouvelles questions qui sont hors sujet ici.


@Alan Merci d'avoir donné une réponse J'ai ajouté Evernote WorkJob ApI dans mon projet


5 Réponses :


0
votes

Vous ne pouvez pas modifier la durée minimale de 15 minutes. S'il peut être changé en moins que cela, il ne sera pas appelé minimum. Selon vos besoins, essayez d'utiliser Alarm Manager ou FCM. Reportez-vous au lien suivant pour plus de détails: https://developer.android.com/training / efficient-downloads / regular_updates


2 commentaires

Hii @Alan après un certain temps, j'ai fait beaucoup de recherches et j'ai trouvé evernote-android / job github.com/ evernote / android-job , cela fonctionne bien certains appareils supérieurs au niveau d'API 21 (MarshMallow) mais dans les appareils MI ne fonctionnent pas


@ShubhanshuSingh Merci d'avoir partagé vos découvertes. Je tiens également à noter que la planification du travail pour réveiller fréquemment l'appareil peut consommer beaucoup de batterie et entraîner une mauvaise expérience utilisateur. Je conseillerais de vraiment m'assurer que cela n'est utilisé qu'en cas de nécessité absolue.



0
votes

Non, vous ne pouvez pas réduire la durée à moins de PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS qui est de 15 minutes C'est une limitation du système en raison de l'économie de batterie, il n'y a pas de piratage.


0 commentaires

0
votes

Nous avons un hack pour réduire le temps de 15 minutes pour s'exécuter périodiquement. Mais vous ne pouvez pas utiliser PeriodicWorkRequest. Créez OneTimeWorkRequest avec un délai initial et appelez-vous à la fin du travail à l'intérieur du worker. si nécessaire créer the backgroundExecutor.execute {} et appelez de l'intérieur pour effectuer un appel asynchrone. Signifie que le worker qui s'est appelé self ne sera pas arrêté ou onStopped () ne sera pas appelé.

ExistingWorkPolicy.REPLACE | KEEP peut être requis en fonction de vos besoins.


0 commentaires

0
votes

Une réponse simple est Non , vous ne pouvez pas réduire le temps à moins de MIN_PERIODIC_INTERVAL_MILLIS qui est codé en dur à 15 minutes.

Cependant, vous pouvez tester PeriodicWorkRequest plus tôt que MIN_PERIODIC_INTERVAL_MILLIS qui est de 15 minutes.

Pour cela, vous avez besoin de WorkManagerTestInitHelper disponible dans androidx.work.testing.

Tout d'abord, ajoutez la dépendance suivante dans le build.gradle pour votre application ou module:

@Test
public void testPeriodicWork(Context context) throws Exception {
    // Setup input data
    Data input = new Data.Builder().put(KEY_1, 1).put(KEY_2, 2).build();

    // Create periodic work request
    PeriodicWorkRequest request = new PeriodicWorkRequest.Builder(MyWorker.class, 15,  TimeUnit.MINUTES)
                                       .setInputData(input)
                                       .build();
    // Enqueue periodic request
    WorkManager.getInstance(context).enqueueUniquePeriodicWork(WORKER_TAG, ExistingPeriodicWorkPolicy.REPLACE, request);

    // Initialize testDriver
    TestDriver testDriver = WorkManagerTestInitHelper.getTestDriver();

    // Tells the testing framework the period delay is met, this will execute your code in doWork() in MyWorker class
    testDriver.setPeriodDelayMet(request.getId());

}

Ensuite, vous devez utiliser la méthode setPeriodDelayMet disponible avec TestDriver qui peut être utilisé pour indiquer qu'un intervalle est complet et exécute PeriodicWorkRequest plus tôt que MIN_PERIODIC_INTERVAL_MILLIS (15 minutes). Exemple de code:

//Current stable release is 2.3.4
androidTestImplementation "androidx.work:work-testing:2.3.4

Vous pouvez trouver plus d'informations sur le test de PeriodicWorkRequest sur https://developer.android.com/topic/libraries/architecture/workmanager/how-to/integration-testing#periodic-work a>

En savoir plus sur le test de WorkManager à https: / /developer.android.com/reference/androidx/work/testing/WorkManagerTestInitHelper et https://developer.android.com/reference/androidx/work/testing/TestDriver


0 commentaires

0
votes

Si l'intervalle est inférieur à 15 minutes, je crée plusieurs tâches, comme celle-ci:

if (PublicStaticData.systemSet.rescueuploadinterval <= 15) {
          WorkManager.getInstance(this).cancelAllWorkByTag("uploadLocationWork")
          val tasks = 15 / PublicStaticData.systemSet.rescueuploadinterval
          for (taskNo in 0 until tasks) {
            val uploadLocationWork = PeriodicWorkRequestBuilder<UploadLocationWork>(
                PublicStaticData.systemSet.rescueuploadinterval.toLong(), TimeUnit.MINUTES)
                .addTag("uploadLocationWork")
                .setInitialDelay((PublicStaticData.systemSet.rescueuploadinterval * taskNo).toLong(), TimeUnit.MINUTES)
                .build()
            WorkManager.getInstance(this).enqueue(uploadLocationWork)
            Log.e("jjj", "任务${taskNo}延迟${PublicStaticData.systemSet.rescueuploadinterval * taskNo}开始")
          }
        } else {
          // 超过15分钟,正常用就行
          WorkManager.getInstance(this).cancelAllWorkByTag("uploadLocationWork")
          val uploadLocationWork = PeriodicWorkRequestBuilder<UploadLocationWork>(
              PublicStaticData.systemSet.rescueuploadinterval.toLong(), TimeUnit.MINUTES)
              .addTag("uploadLocationWork")
              .setInitialDelay(PublicStaticData.systemSet.rescueuploadinterval.toLong(), TimeUnit.MINUTES)
              .build()
          WorkManager.getInstance(this).enqueue(uploadLocationWork)
        }

Il y a un écart acceptable.


0 commentaires