일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 서버리스
- raspberry
- OCPP
- 전기차충전
- 에버온
- everon
- 디자인패턴
- 플라스크
- 펌웨어
- 홈어시스턴트
- homeassistant
- 안드로이드
- 완속충전기
- dynamodb
- YMODEM
- Android
- 파이썬
- esp8266
- STM32
- 급속충전기
- thread
- lambda
- flask
- 전기차충전기
- IOT Core
- AWS
- 라즈베리파이
- 충전기
- 전기차
- 보안
- Today
- Total
Louie NRT Story
[안드로이드] WorkManager 본문
작성일: 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
'전기차충전기' 카테고리의 다른 글
[펌웨어] printf 사용법 (0) | 2022.03.07 |
---|---|
[펌웨어] FreeRTOS - MessageQueue (0) | 2022.03.07 |
[안드로이드] Okhttp (0) | 2022.01.12 |
[전기차 충전기] 서울시 보조금 충전기 OCPP 1.6 연동 - 02 (0) | 2022.01.12 |
[전기차 충전기] OCPP 1.6 Security Profile 2 (0) | 2022.01.11 |