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) 를 이용하는 방법도 있습니다.