Android WorkManager - плохо работает после уничтожения приложения - PullRequest
0 голосов
/ 04 февраля 2019

Я создал простой workManager и хочу, чтобы в фоновом режиме цикл for работал 50 раз каждую 1 секунду, поэтому он будет повторять цикл каждую 1 секунду и показывать журнал.Сначала позвольте мне представить мой код.

Это класс WorkManager.

public class WorkerClass extends Worker {

    private static String TAG = "work_tag";

    public WorkerClass(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }

    @NonNull
    @Override
    public Result doWork() {
        try {
            loop();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return Result.success();
    }

    private void loop() throws InterruptedException {
        for (int i = 0; i < 50; i++) {
            Thread.sleep(1000);
            Log.d(TAG, "Working: " + i);
        }
    }
}

А вот и мой MainActivity.

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        OneTimeWorkRequest oneTimeWorkRequest = new OneTimeWorkRequest.Builder(WorkerClass.class).build();

        WorkManager.getInstance().enqueue(oneTimeWorkRequest);
    }
}

Пожалуйста, сообщите мне, если что-то не так.Поэтому, когда я запускаю приложение, оно показывает журнал каждую 1 секунду следующим образом.

D/work_tag: Working: 1
D/work_tag: Working: 2
D/work_tag: Working: 3
D/work_tag: Working: 4
D/work_tag: Working: 5

Хорошо, да?Поэтому, когда я убиваю приложение (onDestroy), через 30-35 секунд цикл снова запускается в фоновом режиме.После этого, когда я открываю приложение, цикл запускается снова, без завершения предыдущего цикла.

Например, в фоновом цикле повторяется 25 раз из 50, и если я открою приложение, log будет выглядеть примерно такэто.

D/work_tag: Working: 25
D/work_tag: Working: 0
D/work_tag: Working: 26
D/work_tag: Working: 1
D/work_tag: Working: 27
D/work_tag: Working: 2
D/work_tag: Working: 28
D/work_tag: Working: 3
D/work_tag: Working: 29
D/work_tag: Working: 4

Видите?После открытия приложения 2 цикла начинают асинхронно повторяться.Итак, первый вопрос: как избежать этого (асинхронно 2 цикла), а второй вопрос: почему после уничтожения приложения мне приходится ждать 30-35 секунд для работы цикла в фоновом режиме?

Я тестирую этов андроиде 6.0

в андроиде 4.4 фоновое задание вообще не планируется.

1 Ответ

0 голосов
/ 04 февраля 2019

На данный момент вы запускаете две разные копии работника - каждый раз, когда начинается ваше действие, вы ставите в очередь новый WorkRequest.Если вы хотите использовать только одну копию, используйте уникальный рабочий запрос: https://developer.android.com/reference/androidx/work/WorkManager#enqueueUniqueWork(java.lang.String,%20androidx.work.ExistingWorkPolicy,%20androidx.work.OneTimeWorkRequest)

...