Несколько запросов OneTimeWorkRequest под Worker, что приводит к зависанию моего приложения - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь реорганизовать приложение, используя WorkerManagr, и столкнулся со следующей проблемой.

В некоторых случаях, когда необходимо вызвать синхронизацию для всех объектов, я делаю это следующим образом:

case Constants.Sync.ALL: //MASTER SYNC
                myData = new Data.Builder()
                        .putBoolean(Constants.Sync.FORCE_SYNC, true)
                        .build();
                workRequest = new OneTimeWorkRequest.Builder(MasterWorker.class)
                        .setInputData(myData)
                        .build();
                workRequestList.add(workRequest);
                break;

И вызывается для постановки в очередь workRequest с использованием:

if(workRequestList.size()>0)
            mWorkManagerInstance
                    .enqueue(workRequestList);

, который вызывает следующий класс:

public class MasterWorker extends Worker {

private Context context;

public MasterWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
    super(context, workerParams);
    this.context = context;
}

@NonNull
@Override
public Result doWork() {
    Boolean forceSync = getInputData().getBoolean(Constants.Sync.FORCE_SYNC, true);
    Intent i = new Intent(context, MasterService.class);
    i.putExtra(Constants.Sync.FORCE_SYNC, forceSync);
    context.startService(i);
    return Result.SUCCESS;
}
}

А из класса MasterWorker называется служба, которая выполняет несколько служб вв то же время, потому что эти службы не возвращают значение результата.

  for (Class s : Constants.ServicesList.services) {
                    if (s.equals(RequestIntentService.class)) {
                        RequestIntentService.startActionMakeRequests(getBaseContext(), Constants.Sync.ALL);
                    }
                    else {
                        Intent i = new Intent(context, s);
                        i.putExtra(Constants.Broadcast.LIST_UPDATE_EVENT, true);
                        i.putExtra(Constants.Broadcast.UPDATE_REMINDERS, false);
                        WorkerHelper.getInstance().startWorkManager(null, i);
                    }
                }

Синхронизация одного, двух сервисов работает нормально.Но в этом случае необходимо синхронизировать около 8 служб, что приводит к зависанию приложения.

Вопрос: Как это можно решить правильно, без необходимости удаления этих служб, пожалуйста?Возможное ли решение для цепных работников в каждом из них немедленно возвращает Result.SUCCESS?

Спасибо за совет.

...