본문 바로가기
안드로이드 자바

[Android][JAVA] 인터넷 연결 여부에 따라 WorkerManager로 순차적으로 처리하기

by teamnova 2024. 11. 25.
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>

 

시연 영상입니다.