Я хочу установить периодическое задание, которое будет выполняться через каждые x часов (не ровно x часов, а минимум x часов).Это необходимо сделать даже после того, как основное действие моего приложения будет уничтожено или после перезагрузки устройства.Так что в соответствии с документами разработчика Android, я выбрал класс менеджера работы для того же.Но код не работает после первого выполнения.Мой код: -
(я использую enqueueUniquePeriodicWork, чтобы избежать нескольких запросов)
В основной деятельности по созданию: -
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
PeriodicWorkRequest uploadWorkRequest = new PeriodicWorkRequest.Builder(UploadWorker.class,16, TimeUnit.MINUTES)
.setBackoffCriteria(
BackoffPolicy.LINEAR,
OneTimeWorkRequest.MIN_BACKOFF_MILLIS,
TimeUnit.MILLISECONDS)
.addTag("workerTest")
.setConstraints(constraints)
.build();
WorkManager.getInstance().enqueueUniquePeriodicWork("mytag", ExistingPeriodicWorkPolicy.REPLACE, uploadWorkRequest);
В загрузке
public class UploadWorker extends Worker {
public UploadWorker(
@NonNull Context context,
@NonNull WorkerParameters params) {
super(context, params);
}
@NonNull
@Override
public Result doWork() {
appendLog(Calendar. getInstance().getTime().toString() + "work manager periodic ");
Log.d("TAG","work manager dowork callback");
return Result.success(outputData);
}
public static void appendLog(String text) {
String fileName = Environment.getExternalStorageDirectory() + "/" + "mylogs.txt";
File logFile = new File(fileName);
if (!logFile.exists())
{
try
{
logFile.createNewFile();
}
catch (IOException e)
{
// TODO Auto-generated catch block
Log.d("TAG","Error:- "+e.toString());
e.printStackTrace();
}
}
try
{
//BufferedWriter for performance, true to set append to file flag
BufferedWriter buf = new BufferedWriter(new FileWriter(logFile, true));
buf.append(text);
buf.newLine();
buf.close();
}
catch (IOException e)
{
// TODO Auto-generated catch block
Log.d("TAG","Errors:- "+e.toString());
e.printStackTrace();
}
}
Что не так с моим кодом?Почему он работает только один раз, а не дальше?