안드로이드 자바

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

teamnova 2024. 11. 25. 12:00
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>

 

시연 영상입니다.