์์ฑ์ผ: 2017.07.09
LiveData ๋ ๊ฐ์ ์ ์งํ๊ณ , ์ด ๊ฐ์ด observed ์ํ๋ฅผ ๊ฐ๊ฒ ํด์ฃผ๋ data holder ํด๋์ค์ด๋ค.
์ผ๋ฐ์ ์ธ Observerble๊ณผ ๋ฌ๋ฆฌ LiveData๋ ์ฑ ์ปดํฌ๋ํธ์ ๋ผ์ดํ ์ฌ์ดํด์ ๋ฐ๋ฅธ๋ค.
LiveData๋ฅผ ์๋๋ก์ด๋ ํ๋ก์ ํธ์ importํ๋ ๋ฐฉ๋ฒ์ adding components to your project
LiveData๋ Observer์ ๋ผ์ดํ ์ฌ์ดํด์ด STARTED ๋๋ RESUMED ์ํ์ผ ๋๋ง Observer๋ฅผ ํ์ฑํ ์ํ๋ก ์ฌ๊ธด๋ค.
Location Sample
public class LocationLiveData extends LiveData<Location> {
private LocationManager locationManager;
private SimpleLocationListener listener = new SimpleLocationListener() {
@Override
public void onLocationChanged(Location location) {
setValue(location);
}
};
public LocationLiveData(Context context) {
locationManager = (LocationManager) context.getSystemService(
Context.LOCATION_SERVICE);
}
@Override
protected void onActive() {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, listener);
}
@Override
protected void onInactive() {
locationManager.removeUpdates(listener);
}
}
- onActive()
- LiveData๊ฐ active observer๋ฅผ ๊ฐ์ง๊ณ ์์ ๋ ํธ์ถ๋๋ค.
๋๋ฐ์ด์ค์ location ์ ๋ฐ์ดํธ ์ ๋ณด observing์ ์์ํ๋ค๋ ์๋ฏธ์ด๋ค.
- LiveData๊ฐ active observer๋ฅผ ๊ฐ์ง๊ณ ์์ ๋ ํธ์ถ๋๋ค.
- onInactive()
- LiveData๊ฐ active observer๋ฅผ ๋์ด์ ๊ฐ์ง์ง ์์ ๋ ํธ์ถ๋๋ค.
์ด๋ค observer๋ ์์ผ๋ LocationManager ์๋น์ค์ ์ฐ๊ฒฐ์ํ๋ฅผ ์ ์งํ ํ์๊ฐ ์๋ค.
์ด๋ฌํ ์ฐ๊ฒฐ์ ์ ์งํ๋ ๊ฒ์ ๋ถํ์ํ๊ฒ ๋ฐฐํฐ๋ฆฌ๋ฅผ ์๋ชจํ๊ธฐ ๋๋ฌธ์ ์ค์ํ ๋ถ๋ถ์ด๋ค.
- LiveData๊ฐ active observer๋ฅผ ๋์ด์ ๊ฐ์ง์ง ์์ ๋ ํธ์ถ๋๋ค.
- setValue()
- LiveData์ ๊ฐ์ ์ ๋ฐ์ดํธํ๊ณ active observer๋ค์๊ฒ ๋ณํ๋ฅผ ์๋ ค์ฃผ๋ ๋ฉ์๋์ด๋ค.
์์ Sample LocationLiveData ์ฌ์ฉ ์
public class MyFragment extends LifecycleFragment {
public void onActivityCreated (Bundle savedInstanceState) {
LiveData<Location> myLocationListener = ...;
Util.checkUserStatus(result -> {
if (result) {
myLocationListener.addObserver(this, location -> {
// update UI
});
}
});
}
}
addObserver()์ ์ฒซ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก LifecycleOwner๋ฅผ ์ ๋ฌํ๋ค.
์ด observer๊ฐ LifecycleOwner์ ๋ผ์ดํ ์ฌ์ดํด์ ๋ฐ๋ฅธ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
- ๋ผ์ดํ ์ฌ์ดํด์ด active state(STARTED or RESUMED)๊ฐ ์๋๋ผ๋ฉด, ๊ฐ์ด ๋ณ๊ฒฝ๋์ด๋ observer๋ ํธ์ถ๋์ง ์๋๋ค.
- ๋ผ์ดํ ์ฌ์ดํด์ด destoryed ๋๋ฉด, observer๋ ์๋์ผ๋ก ์ ๊ฑฐ๋๋ค.
๋ผ์ดํ ์ฌ์ดํด ๊ธฐ๋ฐ์ด๋ผ๋ LiveData์ ์ฅ์ ์ LiveData๋ฅผ ์ฌ๋ฌ ์กํฐ๋นํฐ, ํ๋๊ทธ๋จผํธ ๋ฑ ๊ฐ์ ๊ณต์ ํ ์ ์๊ฒ ํด์ค๋ค.
LiveData๋ฅผ singleton์ผ๋ก ๋ง๋๋ ์
public class LocationLiveData extends LiveData<Location> {
private static LocationLiveData sInstance;
private LocationManager locationManager;
@MainThread
public static LocationLiveData get(Context context) {
if (sInstance == null) {
sInstance = new LocationLiveData(context.getApplicationContext());
}
return sInstance;
}
private SimpleLocationListener listener = new SimpleLocationListener() {
@Override
public void onLocationChanged(Location location) {
setValue(location);
}
};
private LocationLiveData(Context context) {
locationManager = (LocationManager) context.getSystemService(
Context.LOCATION_SERVICE);
}
@Override
protected void onActive() {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, listener);
}
@Override
protected void onInactive() {
locationManager.removeUpdates(listener);
}
}
ํ๋๊ทธ๋จผํธ์์ ์ฌ์ฉํ ๋๋ :
public class MyFragment extends LifecycleFragment {
public void onActivityCreated (Bundle savedInstanceState) {
Util.checkUserStatus(result -> {
if (result) {
LocationLiveData.get(getActivity()).observe(this, location -> {
// update UI
});
}
});
}
}
LiveData์ ์ฅ์ ๋ค
- No memory leaks
- Observer๋ค์ด ๊ฐ๊ฐ ์์ ์ Lifecycle์ ๋ฐ๋ฅด๊ธฐ ๋๋ฌธ์ Lifecycle์ด destroyed ๋ ๋ ๊ทธ๋ค์ ์๋์ผ๋ก ์ ๋ฆฌ๋๋ค.
- No crashes due to stopped activities
- Observer์ Lifecycle ์ด ๋นํ์ฑํ ์ํ์ธ ๊ฒฝ์ฐ(์, ์กํฐ๋นํฐ๊ฐ back stack์ ๋ค์ด๊ฐ๋ ๊ฒฝ์ฐ), ๊ทธ๋ค์ ๋ณ๊ฒฝ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ง ์๋๋ค.
- Always up to date data
- Lifecycle์ด ์ฌ์์๋๋ ๊ฒฝ์ฐ(์, back stack์ ์๋ค๊ฐ ๋ค์ ์์๋๋ ๊ฒฝ์ฐ), ๊ฐ์ฅ ์ต์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ ์๋ค.
- Proper configuration change
- ์กํฐ๋นํฐ๋ ํ๋๊ทธ๋จผํธ๊ฐ configuration ๋ณ๊ฒฝ์ผ๋ก ๋ค์ ๋ง๋ค์ด์ง๋ ๊ฒฝ์ฐ(์, ๋๋ฐ์ด์ค ํ๋ฉด ํ์ ), ์ฆ์ ์ต๊ทผ์ ์ ํจํ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ฒ ๋๋ค.
- Sharing Resources
- LiveData๋ฅผ singleton์ผ๋ก ์ ์งํ ์ ์๊ฒ ๋์๊ณ , ์์คํ ์๋น์ค์ ๋จ ํ๋ฒ๋ง ์ฐ๊ฒฐํ๋ฉด ๋๋ฉฐ, ์ฑ ๋ด์ ๋ชจ๋ observer๋ฅผ ์ง์ํ ์ ์๊ฒ ๋์๋ค.
- No more manual lifecycle handling
- ์ด์ ํ๋๊ทธ๋จผํธ๋ค์ ํ์ํ ๋๋ง ๋ฐ์ดํฐ๋ฅผ observe ํ๋ฉฐ, ํ๋๊ทธ๋จผํธ๊ฐ ์ค์ง๋์์ ๋ observing์ ์ค์ง / ์์ํ ์ง ๊ฑฑ์ ํ์ง ์์๋ ๋๋ค.
- ํ๋๊ทธ๋จผํธ๊ฐ ์์ ์ Lifecycle ์ observing ๋์ ์ ๊ณตํ๋ฏ๋ก, LiveData๋ ์๋์ผ๋ก ์ด ๋ฌธ์ ๋ฅผ ๊ด๋ฆฌํ ์ ์๋ค.
[์ฐธ๊ณ ]
Android developers
'๊ฐ๋ฐ > Android' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Android] Kotlin Extension Function์ ์ฌ์ฉํ์ฌ ๋๋ธ ํด๋ฆญ ๋ฐฉ์งํ๊ธฐ (0) | 2021.04.08 |
---|---|
[Android] Jetpack - LiveData (0) | 2021.04.08 |
[Android] 100% ์ด๋ณด์๋ฅผ ์ํ RxJava(RxJava for 100% beginners)-part 1 (0) | 2021.04.08 |
[Android] ๋ ์ด์์ ๊ณ์ธต ์ฑ๋ฅ ์ต์ ํ(Optimizing Layout Hierarchies) (0) | 2021.04.08 |
[Android] Bitmap์ ์์ ์ ํ๊ธฐ (0) | 2021.04.08 |