Louie NRT Story

[안드로이드] WorkManager 본문

전기차충전기

[안드로이드] WorkManager

hyeok0724.kim@gmail.com 2022. 1. 18. 11:59
반응형

작성일: 22년 1월 18일

 

 

Index

1. WorkManager 추가

2. SampleWorker 코드

3. MainActivity 코드

4. Worker의 상태 확인

5. 그외 기능

 

 

1. WorkManager 추가

 - 해당 라이브러리를 프로젝트에 추가시킴

 

 

2. SampleWorker 코드

 - number로 받은 데이터를 1초 간격으로 Log를 찍는 단순한 코드임

 - 작업이 완료되면 outPutData를 보낼 수 있는데 사용법으로는 Worker의 Status가 "Success"가 되면 받을 수 있도록 함

public class SampleWorker extends Worker {
    private static final String TAG = SampleWorker.class.getSimpleName();

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

    @NonNull
    @Override
    public Result doWork() {
        Data inputData = getInputData();
        int number = inputData.getInt("number", -1);
        Log.d(TAG, "doWork(): number: " + number);

        for (int i = number; i > 0; i--){
            Log.d(TAG, "doWork: i was: " + i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
                Result.failure();
            }
            //return Result.retry();
        }

        Data outPutData = new Data.Builder()
                .putInt("number", 15)
                .build();

        return Result.success(outPutData);
    }
}

 

 

3. MainActivity 코드

 1) 한번만 실행하는 Request

  - WorkManger에 전달할 Input 데이터를 만듬

  - Constraint를 통하여 Network 연결된 상태 또는 충전중 상태 등과 같이 실행 할때 제한을 만듬

  - OneTimeWorkRequest를 통하여 한번만 실행 할 수 있는 Request를 만듬

  - WorkManager에 Request를 Enqueue 하여 실행 할 수 있도록 함

public class MainActivity extends AppCompatActivity {
    private static final String TAG = MainActivity.class.getSimpleName();

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

        Data data = new Data.Builder()
                .putInt("number", 10)
                .build();

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

        OneTimeWorkRequest downloadRequest = new OneTimeWorkRequest.Builder(SampleWorker.class)
                .setInputData(data)
                .setConstraints(constraints)
                .setInitialDelay(5, TimeUnit.HOURS)
                .addTag("download")
                .build();

        WorkManager.getInstance(this).enqueue(downloadRequest);
    }
}

 

 2) 주기적으로 실행하는 Request

  - PeriodicWorkRequest를 통하여 설정한 시간에 따라서 주기적으로 실행함(최소 15분)

  ※ JobSchedule에서 가져왔기 때문에 그것과 동일한 스펙의 15분 주기가 최소값임

  - InputData와 제한을 둘수 있는 Constraints, 시작 Delay InitialDelay, Request를 쉽게 부를수 있는 Tag를 넣을 수 있음

public class MainActivity extends AppCompatActivity {
    private static final String TAG = MainActivity.class.getSimpleName();

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

        Data data = new Data.Builder()
                .putInt("number", 10)
                .build();

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

        PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest.Builder(SampleWorker.class, 7, TimeUnit.DAYS)
                .setInputData(data)
                .setConstraints(constraints)
                .setInitialDelay(10, TimeUnit.HOURS)
                .addTag("Periodic")
                .build();

        WorkManager.getInstance(this).enqueue(periodicWorkRequest);
    }
}

 

 

4. Worker의 상태 확인

 - Worker에서 동작중인 정보들을 확인 할 수 있음

WorkManager.getInstance(this).getWorkInfosByTagLiveData("download").observe(this,
        new Observer<List<WorkInfo>>() {
            @Override
            public void onChanged(List<WorkInfo> workInfos) {
                for (WorkInfo w: workInfos){
                    Log.d(TAG, "onCreate(): Work Status: " + w.getState());
                }

            }
        });

WorkManager.getInstance(this).getWorkInfoByIdLiveData(downloadRequest.getId()).observe(this,
        new Observer<WorkInfo>() {
            @Override
            public void onChanged(WorkInfo workInfo) {
                Log.d(TAG, "onCHanged: Work Status: " + workInfo.getState());
            }
        });

 

 

5. 그외 기능

 - 취소할 수 있는 Cancel과 순서대로 할 수 있는 beginWith와 같은 기능들도 있으니 더 익히면 좋을듯

//동작중인 Request를 취소 할 수 있음 
WorkManager.getInstance(this).cancelWorkById(downloadRequest.getId());

//순서대로 실행될 수 있도록 할 수 있음 Request가 수행되고 Request2가 수행됨
WorkManager.getInstance(this).beginWith(downloadRequest)
        .then(downloadRequest2)
        .enqueue();

 

 

Referece:

https://www.youtube.com/watch?v=-prIcKMlrYQ 

https://www.youtube.com/watch?v=Hrc7slbdTdM 

 

반응형
Comments