본문 바로가기
Android/Features

[Android] 백그라운드 스레드에서 메인 스레드로 데이타 전달하는 방법

by startSW 2023. 11. 22.

1. Handler를 사용하기

import android.os.Handler;
import android.os.Looper;

public class YourBackgroundThread extends Thread {
    private Handler mainHandler;

    public YourBackgroundThread() {
        // 메인 스레드의 Looper를 사용하여 Handler를 생성
        mainHandler = new Handler(Looper.getMainLooper());
    }

    @Override
    public void run() {
        // 백그라운드 스레드에서 수행할 작업
        // ...

        // 작업이 완료되면 메인 스레드로 결과를 전달
        mainHandler.post(new Runnable() {
            @Override
            public void run() {
                // 메인 스레드에서 처리할 작업
                // UI 업데이트 등
                // ...
            }
        });
    }
}

 

2. AsyncTask 사용하기 (deprecated, AsyncTask는 현재는 권장되지 않음)

import android.os.AsyncTask;

public class YourAsyncTask extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... voids) {
        // 백그라운드 스레드에서 수행할 작업
        // ...

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        // 메인 스레드에서 처리할 작업
        // UI 업데이트 등
        // ...
    }
}

 

3. runOnUiThread 사용하기

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        // 메인 스레드에서 처리할 작업
        // UI 업데이트 등
        // ...
    }
});

 

4. LiveData 및 ViewModel 사용하기 (Android Architecture Components)

import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

public class YourViewModel extends ViewModel {
    private MutableLiveData<ResultType> resultLiveData = new MutableLiveData<>();

    public LiveData<ResultType> getResultLiveData() {
        return resultLiveData;
    }

    public void performBackgroundTask() {
        // 백그라운드 스레드에서 수행할 작업
        // ...

        // 작업이 완료되면 결과를 LiveData에 전달
        resultLiveData.postValue(result);
    }
}

 

이러한 방법들 중에서 선택할 때는 프로젝트의 특정 요구사항과 아키텍처에 따라 적절한 방법을 선택하는 것이 중요합니다.

최근에는 Android Architecture Components 중 하나인 LiveData or Flow와 ViewModel을 사용하여 데이터를 관리하는 것이 권장되는 방법 중 하나입니다.

그리고 BroadcastReceiver(https://swjsw.tistory.com/89) 를 이용하는 방법도 있습니다.