Android Workmanger PeriodicWorkRequest API работает только один раз? - PullRequest
0 голосов
/ 13 декабря 2018

Я использую androidx API диспетчера работ, в Диспетчере работ использую PeriodicWorkRequest для запуска Работы каждые 4 часа.Но это работает только один раз после запуска приложения.

Кодирование PeriodicWorkRequest: -

Constraints constraints = new Constraints.Builder()
            .setRequiredNetworkType(NetworkType.CONNECTED)
            .build();

PeriodicWorkRequestpendingCampaignWork = new PeriodicWorkRequest.Builder(PendingCampaignWorker.class, 4, TimeUnit.HOURS)
            .setConstraints(constraints)
            .build();

Код менеджера работ для постановки в очередь запроса: -

WorkManager.getInstance().enqueueUniquePeriodicWork(LATEST_CAMPAIGN_WORK, ExistingPeriodicWorkPolicy.KEEP, pendingCampaignWork);

Дляtest am change Системное время Вручную до 4 часов после запуска приложения в эмуляторе для запуска работы.

Есть ли какая-либо проблема в моем коде, помогающая мне решить проблему.

Обновление: -

Work Manager работает нормально, он не работает в зависимости от системного времени, как сказано в разделе ответов m.hassan .Я проверяю, чтобы активировать work каждые 20 минут, все работает нормально.

1 Ответ

0 голосов
/ 15 декабря 2018

Диспетчер работ Не основано на системном времени.Вы можете сделать периодический запрос на работу в течение 15 минут.Таким образом, вы можете проверить свой код.

вот пример:

Мой периодический запрос на работу:

private static final String TAG = "PeriodicWorkTag";
private static final int PERIODIC_WORK_INTERVAL = 15;

public static void schedulePeriodicWork() {
    androidx.work.PeriodicWorkRequest periodicWorkRequest = new androidx.work.PeriodicWorkRequest.Builder(PeriodicWorkRequest.class, PERIODIC_WORK_INTERVAL,
            TimeUnit.MINUTES)
            .addTag(TAG)
            .build();
    WorkManager.getInstance().enqueueUniquePeriodicWork(TAG, ExistingPeriodicWorkPolicy.KEEP, periodicWorkRequest);
}

public static void cancelPeriodicWork() {
    WorkManager.getInstance().cancelAllWorkByTag(TAG);
}

Мой рабочий класс:

public static final String CHANNEL_ID = "VERBOSE_NOTIFICATION" ;
public PeriodicWorkRequest(@NonNull Context context, @NonNull WorkerParameters workerParams) {
    super(context, workerParams);
}

@NonNull
@Override
public Result doWork() {
    showNotification(getApplicationContext());
    return Result.SUCCESS;
}

private void showNotification(Context context) {
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context, CHANNEL_ID)
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle("My notification")
            .setContentText("ddd")
            .setStyle(new NotificationCompat.BigTextStyle()
                    .bigText("ddd"))
            .setPriority(NotificationCompat.PRIORITY_DEFAULT);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        CharSequence name = "Channel_name";
        String description = "description";
        int importance = NotificationManager.IMPORTANCE_DEFAULT;
        NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
        channel.setDescription(description);
        NotificationManager notificationManager = context.getSystemService(NotificationManager.class);
        notificationManager.createNotificationChannel(channel);
    }
    NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);
    notificationManager.notify(100, mBuilder.build());
}
...