ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • android WorkManager 중복 실행 이슈
    dev/android 2019. 2. 28. 17:39



    Android Jetpack 에서 제공하는 기능중 WorkManager 를 이용하여 주기적으로 로컬 데이터를 온라인으로 저장하는 기능을 구현하였다.


    테스트 도중 로그 내용을 확인해보니 어느샌가 작업자가 실행될 때 동시에 몇번씩 실행되는 현상이 발생되었다.


    해당 현상에 대해 검색을 해보니 다음과 같은 답변을 확인.


    https://stackoverflow.com/questions/51612274/check-if-workmanager-is-scheduled-already


    결론적으로는,


    아래와 같이 사용하는 코드를

    WorkManager.getInstance().enqueue(sendWork);


    다음처럼 수정.

    WorkManager.getInstance().enqueueUniquePeriodicWork("mywork", ExistingPeriodicWorkPolicy.KEEP, sendWork);


    그리고 기존 코드에 의해 생성된 work 데이터가 남아 있으므로 앱 데이터를 삭제해주어야 한다.

    cancelXXX 함수로 기존 work 를 취소하는 코드를 추가하면 된다.


    이때 cancelAllWork 를 사용한다면 다른 work 를 enqueue 하는 코드보다 먼저 실행되도록 신경써야 할 것이다.



    추가로 테스트 했던 결과는 아래에 설명한다.


    WorkManager 는 내부적으로 별도의 db 에 work 에 대한 정보를 저장하는데,


    크롬 개발자 도구에서 확인하면 아래와 같은 내용들이 있다.




    ...

    2019-02-28 14:45:11.477 7074-7074/? W/WM-WorkSpec: Interval duration lesser than minimum allowed value; Changed to 900000

    2019-02-28 14:45:16.535 7074-7116/io.exosystems.exorehab.android I/ExerciseSendWorker: [work begin]

    2019-02-28 14:45:16.537 7074-7116/io.exosystems.exorehab.android I/ExerciseSendWorker: [work end]

    2019-02-28 14:45:16.539 7074-7090/io.exosystems.exorehab.android I/WM-WorkerWrapper: Worker result SUCCESS for Work [ id=9d72321d-db47-4593-a6c9-edd5836b5e42, tags={ io.exosystems.exorehab.android.worker.ExerciseSendWorker } ]

    2019-02-28 14:45:26.756 7074-7138/io.exosystems.exorehab.android I/ResponseBodyFileManager: Cleaned up temporary network files.

    2019-02-28 14:59:01.328 7074-9108/io.exosystems.exorehab.android I/ExerciseSendWorker: [work begin]

    2019-02-28 14:59:04.790 7074-9108/io.exosystems.exorehab.android I/ExerciseSendWorker: [work end]

    2019-02-28 14:59:04.792 7074-7090/io.exosystems.exorehab.android I/WM-WorkerWrapper: Worker result SUCCESS for Work [ id=707e54b4-f388-4030-b4d2-0acee7c51571, tags={ io.exosystems.exorehab.android.worker.ExerciseSendWorker } ]

    2019-02-28 14:59:05.882 7074-9130/io.exosystems.exorehab.android I/ExerciseSendWorker: [work begin]

    2019-02-28 14:59:05.884 7074-9130/io.exosystems.exorehab.android I/ExerciseSendWorker: [work end]

    2019-02-28 14:59:05.886 7074-7090/io.exosystems.exorehab.android I/WM-WorkerWrapper: Worker result SUCCESS for Work [ id=4a8e3864-4ec6-4df3-864c-b3819d55975d, tags={ io.exosystems.exorehab.android.worker.ExerciseSendWorker } ]

    2019-02-28 15:00:11.548 7074-7116/io.exosystems.exorehab.android I/ExerciseSendWorker: [work begin]

    2019-02-28 15:00:11.549 7074-7116/io.exosystems.exorehab.android I/ExerciseSendWorker: [work end]

    2019-02-28 15:00:11.552 7074-7090/io.exosystems.exorehab.android I/WM-WorkerWrapper: Worker result SUCCESS for Work [ id=9d72321d-db47-4593-a6c9-edd5836b5e42, tags={ io.exosystems.exorehab.android.worker.ExerciseSendWorker } ]

    ...

    여기까지가 앱을 3회 실행한 상태이며 실행 도중의 로그이다.


    지정된 주기마다 begin/end 가 나타나는것을 기대했지만, 실제 실행된 worker id 를 보면 db 에 있는 work 가 모두 수행되었다.



    여기서 앱을 1회 더 실행해 보면,




    ...

    2019-02-28 15:02:18.992 9586-9586/? W/WM-WorkSpec: Interval duration lesser than minimum allowed value; Changed to 900000

    2019-02-28 15:02:19.155 9586-9617/? I/ExerciseSendWorker: [work begin]

    2019-02-28 15:02:19.157 9586-9617/? I/ExerciseSendWorker: [work end]

    2019-02-28 15:02:19.163 9586-9602/? I/WM-WorkerWrapper: Worker result SUCCESS for Work [ id=02261fd8-1e7f-444b-a133-3ec9615e7998, tags={ io.exosystems.exorehab.android.worker.ExerciseSendWorker } ]

    2019-02-28 15:02:39.912 9586-9670/io.exosystems.exorehab.android I/ResponseBodyFileManager: Cleaned up temporary network files.

    2019-02-28 15:03:04.545 9586-9670/io.exosystems.exorehab.android I/ResponseBodyFileManager: Cleaned up temporary network files.

    2019-02-28 15:14:23.688 9586-11223/io.exosystems.exorehab.android I/ExerciseSendWorker: [work begin]

    2019-02-28 15:14:23.693 9586-11223/io.exosystems.exorehab.android I/ExerciseSendWorker: [work end]

    2019-02-28 15:14:23.701 9586-9602/io.exosystems.exorehab.android I/WM-WorkerWrapper: Worker result SUCCESS for Work [ id=4a8e3864-4ec6-4df3-864c-b3819d55975d, tags={ io.exosystems.exorehab.android.worker.ExerciseSendWorker } ]

    2019-02-28 15:14:23.704 9586-11225/io.exosystems.exorehab.android I/ExerciseSendWorker: [work begin]

    2019-02-28 15:14:23.706 9586-11225/io.exosystems.exorehab.android I/ExerciseSendWorker: [work end]

    2019-02-28 15:14:23.711 9586-9602/io.exosystems.exorehab.android I/WM-WorkerWrapper: Worker result SUCCESS for Work [ id=707e54b4-f388-4030-b4d2-0acee7c51571, tags={ io.exosystems.exorehab.android.worker.ExerciseSendWorker } ]

    2019-02-28 15:15:23.888 9586-9617/io.exosystems.exorehab.android I/ExerciseSendWorker: [work begin]

    2019-02-28 15:15:23.889 9586-9617/io.exosystems.exorehab.android I/ExerciseSendWorker: [work end]

    2019-02-28 15:15:23.892 9586-9602/io.exosystems.exorehab.android I/WM-WorkerWrapper: Worker result SUCCESS for Work [ id=9d72321d-db47-4593-a6c9-edd5836b5e42, tags={ io.exosystems.exorehab.android.worker.ExerciseSendWorker } ]

    2019-02-28 15:15:27.221 9586-11362/io.exosystems.exorehab.android I/ResponseBodyFileManager: Cleaned up temporary network files.

    ...

    추가된 work 가 먼저 실행되고 다음 실행 주기에 기존 등록된 work 를 포함하여 모두 실행이 되었다.



    위에서 얻은 답변대로 코드를 수정하고 다시 실행을 하면,





    WorkName 테이블에 'mywork' 라는 이름의 work 가 추가로 등록된게 보인다.


    2019-02-28 15:39:09.522 14784-14784/io.exosystems.exorehab.android W/WM-WorkSpec: Interval duration lesser than minimum allowed value; Changed to 900000

    2019-02-28 15:39:09.869 14784-14832/io.exosystems.exorehab.android I/ExerciseSendWorker: [work begin]

    2019-02-28 15:39:09.872 14784-14832/io.exosystems.exorehab.android I/ExerciseSendWorker: [work end]

    2019-02-28 15:39:09.875 14784-14800/io.exosystems.exorehab.android I/WM-WorkerWrapper: Worker result SUCCESS for Work [ id=2b6bd764-854b-4ce6-b43d-4f847f69c714, tags={ io.exosystems.exorehab.android.worker.ExerciseSendWorker } ]

    2019-02-28 15:39:18.147 14784-14851/io.exosystems.exorehab.android I/ResponseBodyFileManager: Cleaned up temporary network files.

    2019-02-28 15:44:21.208 14784-15520/io.exosystems.exorehab.android I/ExerciseSendWorker: [work begin]

    2019-02-28 15:44:21.210 14784-15520/io.exosystems.exorehab.android I/ExerciseSendWorker: [work end]

    2019-02-28 15:44:21.219 14784-15521/io.exosystems.exorehab.android I/ExerciseSendWorker: [work begin]

    2019-02-28 15:44:21.222 14784-15521/io.exosystems.exorehab.android I/ExerciseSendWorker: [work end]

    2019-02-28 15:44:21.223 14784-14800/io.exosystems.exorehab.android I/WM-WorkerWrapper: Worker result SUCCESS for Work [ id=4a8e3864-4ec6-4df3-864c-b3819d55975d, tags={ io.exosystems.exorehab.android.worker.ExerciseSendWorker } ]

    2019-02-28 15:44:21.238 14784-14800/io.exosystems.exorehab.android I/WM-WorkerWrapper: Worker result SUCCESS for Work [ id=707e54b4-f388-4030-b4d2-0acee7c51571, tags={ io.exosystems.exorehab.android.worker.ExerciseSendWorker } ]

    2019-02-28 15:45:21.288 14784-14832/io.exosystems.exorehab.android I/ExerciseSendWorker: [work begin]

    2019-02-28 15:45:21.296 14784-14832/io.exosystems.exorehab.android I/ExerciseSendWorker: [work end]

    2019-02-28 15:45:21.302 14784-14800/io.exosystems.exorehab.android I/WM-WorkerWrapper: Worker result SUCCESS for Work [ id=9d72321d-db47-4593-a6c9-edd5836b5e42, tags={ io.exosystems.exorehab.android.worker.ExerciseSendWorker } ]

    2019-02-28 15:47:23.205 14784-15520/io.exosystems.exorehab.android I/ExerciseSendWorker: [work begin]

    2019-02-28 15:47:23.206 14784-15520/io.exosystems.exorehab.android I/ExerciseSendWorker: [work end]

    2019-02-28 15:47:23.209 14784-14800/io.exosystems.exorehab.android I/WM-WorkerWrapper: Worker result SUCCESS for Work [ id=02261fd8-1e7f-444b-a133-3ec9615e7998, tags={ io.exosystems.exorehab.android.worker.ExerciseSendWorker } ]

    하지만 수정된 코드로 실행을 해보아도 새로운 작업과 함께 기존 작업도 수행이 되어버린다.


    이전 코드에 의해 db 에 기록된 work 가 실행되므로 이를 제거하기 위해 앱 데이터를 초기화 해주고 다시 실행을 해보았다.





    2019-02-28 16:18:26.486 20498-20498/? W/WM-WorkSpec: Interval duration lesser than minimum allowed value; Changed to 900000

    2019-02-28 16:18:27.971 20498-20530/io.exosystems.exorehab.android I/ExerciseSendWorker: [work begin]

    2019-02-28 16:18:27.973 20498-20530/io.exosystems.exorehab.android I/ExerciseSendWorker: [work end]

    2019-02-28 16:18:27.975 20498-20514/io.exosystems.exorehab.android I/WM-WorkerWrapper: Worker result SUCCESS for Work [ id=a13ce034-c4d2-44ae-b892-006d1dfbf496, tags={ io.exosystems.exorehab.android.worker.ExerciseSendWorker } ]

    2019-02-28 16:18:42.223 20498-20564/io.exosystems.exorehab.android I/ResponseBodyFileManager: Cleaned up temporary network files.

    2019-02-28 16:33:23.284 20498-22546/io.exosystems.exorehab.android I/ExerciseSendWorker: [work begin]

    2019-02-28 16:33:23.286 20498-22546/io.exosystems.exorehab.android I/ExerciseSendWorker: [work end]

    2019-02-28 16:33:23.289 20498-20514/io.exosystems.exorehab.android I/WM-WorkerWrapper: Worker result SUCCESS for Work [ id=a13ce034-c4d2-44ae-b892-006d1dfbf496, tags={ io.exosystems.exorehab.android.worker.ExerciseSendWorker } ]

    2019-02-28 16:48:23.048 20498-24526/io.exosystems.exorehab.android I/ExerciseSendWorker: [work begin]

    2019-02-28 16:48:23.050 20498-24526/io.exosystems.exorehab.android I/ExerciseSendWorker: [work end]

    2019-02-28 16:48:23.052 20498-20514/io.exosystems.exorehab.android I/WM-WorkerWrapper: Worker result SUCCESS for Work [ id=a13ce034-c4d2-44ae-b892-006d1dfbf496, tags={ io.exosystems.exorehab.android.worker.ExerciseSendWorker } ]

    결과적으로 원하는 대로 1개의 work 만 존재하고 지정된 시간 마다 작업이 한번만 수행됨을 확인하였다.

Designed by Tistory.