728x90
안녕하세요,
오늘은 WorkerManager를 활용하여 인터넷 연결 여부에 따라 작업을 순차적으로 처리하는 예제를 만들어보도록 하겠습니다.
MainActivity.java
public class MainActivity extends AppCompatActivity {
private ProgressBar task1ProgressBar, task2ProgressBar, task3ProgressBar;
private TextView task1Status, task2Status, task3Status;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// ProgressBar와 TextView 초기화
task1ProgressBar = findViewById(R.id.task1ProgressBar);
task2ProgressBar = findViewById(R.id.task2ProgressBar);
task3ProgressBar = findViewById(R.id.task3ProgressBar);
task1Status = findViewById(R.id.task1Status);
task2Status = findViewById(R.id.task2Status);
task3Status = findViewById(R.id.task3Status);
// 네트워크 연결 필요 조건 생성
Constraints networkConstraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED) // 네트워크 연결 필수
.build();
// 작업 요청 생성
OneTimeWorkRequest task1Request = new OneTimeWorkRequest.Builder(NetworkDependentWorker.class)
.setInputData(new Data.Builder().putInt("taskId", 1).build())
.setConstraints(networkConstraints) // 네트워크 조건 추가
.build();
OneTimeWorkRequest task2Request = new OneTimeWorkRequest.Builder(NetworkDependentWorker.class)
.setInputData(new Data.Builder().putInt("taskId", 2).build())
.setConstraints(networkConstraints) // 네트워크 조건 추가
.build();
OneTimeWorkRequest task3Request = new OneTimeWorkRequest.Builder(NetworkDependentWorker.class)
.setInputData(new Data.Builder().putInt("taskId", 3).build())
.setConstraints(networkConstraints) // 네트워크 조건 추가
.build();
// 작업 순서 설정
WorkManager.getInstance(this)
.beginWith(task1Request)
.then(task2Request)
.then(task3Request)
.enqueue();
// 작업 상태 관찰 및 UI 업데이트
observeWork(task1Request.getId(), task1ProgressBar, task1Status);
observeWork(task2Request.getId(), task2ProgressBar, task2Status);
observeWork(task3Request.getId(), task3ProgressBar, task3Status);
}
private void observeWork(@NonNull java.util.UUID workId, ProgressBar progressBar, TextView statusTextView) {
WorkManager.getInstance(this).getWorkInfoByIdLiveData(workId).observe(this, new Observer<WorkInfo>() {
@Override
public void onChanged(WorkInfo workInfo) {
if (workInfo != null) {
if (workInfo.getState() == WorkInfo.State.RUNNING) {
int progress = workInfo.getProgress().getInt("progress", 0);
progressBar.setProgress(progress);
statusTextView.setText(progress + "%");
} else if (workInfo.getState() == WorkInfo.State.SUCCEEDED) {
progressBar.setProgress(100);
statusTextView.setText("완료");
} else if (workInfo.getState() == WorkInfo.State.FAILED) {
statusTextView.setText("실패");
}
}
}
});
}
}
NetworkDependentWorker.java
public class NetworkDependentWorker extends Worker {
public NetworkDependentWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
}
@NonNull
@Override
public Result doWork() {
int taskId = getInputData().getInt("taskId", -1);
// 10초 동안 작업 진행 (진행률 업데이트)
for (int i = 1; i <= 10; i++) {
try {
Thread.sleep(1000); // 1초 대기
int progress = i * 10; // 10%, 20%, ..., 100%
setProgressAsync(new Data.Builder().putInt("progress", progress).build());
} catch (InterruptedException e) {
e.printStackTrace();
return Result.failure();
}
}
// 작업 성공 시 반환
return Result.success();
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:id="@+id/task1Status"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="작업1 : 실행 대기"
android:textSize="16sp"
android:layout_marginBottom="8dp" />
<ProgressBar
android:id="@+id/task1ProgressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:progress="0"
android:max="100"
android:layout_marginBottom="16dp" />
<TextView
android:id="@+id/task2Status"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="작업2 : 실행 대기"
android:textSize="16sp"
android:layout_marginBottom="8dp" />
<ProgressBar
android:id="@+id/task2ProgressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:progress="0"
android:max="100"
android:layout_marginBottom="16dp" />
<TextView
android:id="@+id/task3Status"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="작업3 : 실행 대기"
android:textSize="16sp"
android:layout_marginBottom="8dp" />
<ProgressBar
android:id="@+id/task3ProgressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:progress="0"
android:max="100" />
</LinearLayout>
시연 영상입니다.
'안드로이드 자바' 카테고리의 다른 글
[Java][Android] ArrayList와 LinkedList 차이 (0) | 2024.12.01 |
---|---|
[Java][Android] TextInputLayout 을 사용한 비밀번호 가시성 토글 기능 (0) | 2024.11.26 |
[Java][Android] TextInputLayout의 Counter 기능 (글자 수 제한) (4) | 2024.11.20 |
[JAVA][Android] webView를 사용하여 앱에서 웹페이지 띄우기 (0) | 2024.11.18 |
[Java][Android] 문자열 형식 체크하기 (3) | 2024.11.17 |