Android-ViewModel 과 LiveData 사용 에 대한 자세 한 설명
예 를 들 어 Activity 는 설정 이 바 뀌 었 을 때(화면 회전)Activity 가 다시 만 들 고 onCreate()방법 도 다시 호출 됩 니 다.저 희 는 onSave InstanceState()방법 에서 데 이 터 를 저장 하고 onCreate()방법 에서 Bundle 을 통 해 데 이 터 를 복원 할 수 있 습 니 다.그러나 이 방법 은 잠재 적 인 대량의 데이터 에 만 적용 되 지 않 고 직렬 화 할 수 있 는 소량의 데이터 에 만 적 용 됩 니 다.ViewModel 을 사용 하면 ViewModel 은 이전 데 이 터 를 자동 으로 저장 하고 새로운 Activity 나 Fragment 에 사용 합 니 다.현재 Activity 가 시스템 에 의 해 삭 제 될 때 까지 Framework 는 View Model 의 onCleared()방법 을 호출 합 니 다.우 리 는 onCleared()방법 에서 자원 청 소 를 할 수 있 습 니 다.
LiveData 는 관찰 가능 한 데이터 소지 자 클래스 입 니 다.흔히 볼 수 있 는 관찰자 와 달리 라 이브 데 이 터 는 라 이 프 사이클 감지 가 있다.이것 은 Activity,Fragment 또는 Service 와 같은 다른 응용 프로그램 구성 요소 의 생명 주 기 를 존중 한 다 는 것 을 의미한다.이러한 감 지 는 라 이브 데이터 가 라 이 프 사이클 상태 에 있 는 응용 프로그램 구성 요소 만 업데이트 하도록 확보한다.
라 이브 데 이 터 는 observer 류 가 표시 하 는 관찰자 가 활동 상태 로 간주 하 는 것 으로,만약 수명 주기 가 STARTED 또는 RESUMED 상태 라면.라 이브 데 이 터 는 관찰 자 를 활동 상태 로 보고 데이터 의 변 화 를 알려 준다.LiveData 미등 록 관찰 대상 및 비 활동 관찰 자 는 업데이트 에 대한 통 지 를 받 지 않 습 니 다.
LiveData 의 장점:
UI 인터페이스의 데이터 상태 확보
LiveData 는 관찰자 모드 를 따른다.LiveData 는 수명 주기 상태 가 변 경 될 때 Observer 대상 에 게 알 리 고 이 Observer 대상 의 UI 를 업데이트 합 니 다.관찰 자 는 프로그램 데이터 가 변 경 될 때마다 UI 를 업데이트 할 수 있 으 며,변 경 될 때마다 UI 를 업데이트 하 는 것 이 아 닙 니 다.
메모리 누 출 없 음
관찰자 가 해당 하 는 LifeCycle 에 연결 되면 페이지 가 삭 제 될 때 자동 으로 제거 되 고 메모리 가 넘 치지 않 습 니 다.
액 티 비 티 가 보이 지 않 는 다 고 해서 Crash 가 되 지 는 않 을 거 예요.
액 티 비 티 가 보이 지 않 을 때 데이터 변화 가 있어 도 라 이브 데 이 터 는 관찰자 에 게 알 리 지 않 는 다.이때 관찰자 의 라 이 프 사이클 은 Started 나 RESUMED 상태 가 아니 기 때문이다.
설정 변경
현재 Activity 설정 이 변경 되 었 습 니 다(예 를 들 어 화면 방향).onCreate 에서 다시 한 번 걸 어가 면 관찰자 들 은 설정 이 변경 되 기 전의 최신 데 이 터 를 즉시 받 습 니 다.
더 이상 인위적으로 생명 주 기 를 처리 할 필요 가 없다.
Activity 나 Fragment 는 데 이 터 를 관찰 해 야 할 때 데 이 터 를 관찰 하면 되 며 라 이 프 사이클 변 화 를 신경 쓸 필요 가 없다.이 모든 것 은 라 이브 데이터 에 맡 겨 자동 으로 관리 된다.
ViewModel 과 LiveData 라 이브 러 리 의존 추가
//build.gradle
allprojects {
repositories {
google()
jcenter()
}
}
//app/build.gradle
implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0-alpha1'
ViewModel 정의 및 LiveData 만 들 기
package io.dcloud.H56580E2E.viewModelLiveData;
import android.app.Application;
import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
/**
* ViewModel Fragment
* ViewMode , ViewModel ConfigurationChange 。 : ,activity 。
* Activity , , , 。 activity View , ViewModel 。
* acitivty ConfigrationChange , activity , , ViewModel
*/
/**
* ViewModel LiveData
* ViewModel UI , configuration ( ), ( ViewModel AndroidViewModel/ViewModel )
* AndroidViewModel(ViewModel ): Context ViewModel
*
* LiveData
* ViewModel LiveData
*/
public class DomeModel extends ViewModel {
// LiveData( LiveData..)
private MutableLiveData<DomeInfo> mDomeLiveData;
/**
* LiveData
* setValue()
* @param phone_str
* @param pwd_str
* setValue()
*/
public void setDomeInfo(String phone_str,String pwd_str){
mDomeLiveData.setValue(new DomeInfo(phone_str,pwd_str));
}
/**
* LiveData
* postValue()
* postValue()
*/
public void postDomeInfo(String phone_str,String pwd_str){
mDomeLiveData.postValue(new DomeInfo(phone_str,pwd_str));
}
/**
*
* @return
*/
public MutableLiveData<DomeInfo> getmDomeLiveData(){
if(mDomeLiveData == null){
mDomeLiveData = new MutableLiveData<>();
}
return mDomeLiveData;
}
// MyActivity ,Framework ViewModel onCleared()
@Override
protected void onCleared() {
super.onCleared();
}
}
사용(Activity 에서 Fragment 와 Fragment 와 Fragment 가 서로 통신 하 는 것 을 보 여 줍 니 다)Activity 에서:
package io.dcloud.H56580E2E.viewModelLiveData;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
import butterknife.BindView;
import butterknife.ButterKnife;
import io.dcloud.H56580E2E.R;
import io.reactivex.functions.Consumer;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
import com.jakewharton.rxbinding3.view.RxView;
import java.util.concurrent.TimeUnit;
public class DomeActivity extends AppCompatActivity {
@BindView(R.id.button)
Button addBut;
@BindView(R.id.textView3)
TextView showData_text;
//ViewModel
private DomeModel domeModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dome);
ButterKnife.bind(this);
// Fragment
getSupportFragmentManager().beginTransaction().replace(R.id.frameLayout1,new OneFragment()).commit();
getSupportFragmentManager().beginTransaction().replace(R.id.frameLayout2,new TwoFragment()).commit();
// ViewModel
domeModel = ViewModelProviders.of(this).get(DomeModel.class);
//Button
RxView.clicks(addBut).throttleFirst(2, TimeUnit.SECONDS)
.subscribe(new Consumer<Object>() {
@Override
public void accept(Object unit) throws Exception {
// postValue()
domeModel.postDomeInfo("13233253173","11111111");
}
});
//
domeModel.getmDomeLiveData().observe(this, new Observer<DomeInfo>() {
@Override
public void onChanged(DomeInfo domeInfo) {
showData_text.setText(" :"+domeInfo.getPhone_str()+" :"+domeInfo.getPwd_str());
}
});
}
}
Fragment 1:
package io.dcloud.H56580E2E.viewModelLiveData;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import com.jakewharton.rxbinding3.view.RxView;
import java.util.concurrent.TimeUnit;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;
import io.dcloud.H56580E2E.R;
import io.reactivex.functions.Consumer;
public class OneFragment extends Fragment {
//ButterKnife
private Unbinder unbinder;
// ViewModel
private DomeModel domeModel;
@BindView(R.id.textView)
TextView show_textview;
@BindView(R.id.button2)
Button update_but;
public OneFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View view= inflater.inflate(R.layout.one_fragment, container, false);
unbinder=ButterKnife.bind(this,view);
return view;
}
/*onViewCreated onCreateView */
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
domeModel=ViewModelProviders.of(getActivity()).get(DomeModel.class);
// oneFragment
RxView.clicks(update_but).throttleFirst(2,TimeUnit.SECONDS)
.subscribe(new Consumer<Object>() {
@Override
public void accept(Object unit) throws Exception {
domeModel.postDomeInfo("fragement1323325317","123456");
}
});
// ( RxJava2 )
domeModel.getmDomeLiveData().observe(this, new Observer<DomeInfo>() {
@Override
public void onChanged(DomeInfo domeInfo) {
show_textview.setText(" :"+domeInfo.getPhone_str()+" :"+domeInfo.getPwd_str());
}
});
}
@Override
public void onDestroyView() {
super.onDestroyView();
//Fragment ButterKnife
unbinder.unbind();
}
}
Fragment 2:
package io.dcloud.H56580E2E.viewModelLiveData;
import android.content.Context;
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import com.jakewharton.rxbinding3.view.RxView;
import java.util.concurrent.TimeUnit;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;
import io.dcloud.H56580E2E.R;
import io.reactivex.functions.Consumer;
/**
* A simple {@link Fragment} subclass.
* Activities that contain this fragment must implement the
* create an instance of this fragment.
*/
public class TwoFragment extends Fragment {
@BindView(R.id.textView5)
TextView show_textview;
@BindView(R.id.button3)
Button button;
private DomeModel domeModel;
private Unbinder unbinder;
public TwoFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view= inflater.inflate(R.layout.fragment_two, container, false);
unbinder=ButterKnife.bind(this,view);
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
domeModel = ViewModelProviders.of(getActivity()).get(DomeModel.class);
RxView.clicks(button).throttleFirst(2,TimeUnit.SECONDS)
.subscribe(new Consumer<Object>() {
@Override
public void accept(Object unit) throws Exception {
domeModel.postDomeInfo("fragement2-1323325317","123456");
}
});
// ( RxJava2 )
domeModel.getmDomeLiveData().observe(this, new Observer<DomeInfo>() {
@Override
public void onChanged(DomeInfo domeInfo) {
show_textview.setText(" :"+domeInfo.getPhone_str()+" :"+domeInfo.getPwd_str());
}
});
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
}
@Override
public void onDetach() {
super.onDetach();
}
@Override
public void onDestroyView() {
super.onDestroyView();
//Fragment ButterKnife
unbinder.unbind();
}
}
Dome 실체 클래스:
package io.dcloud.H56580E2E.viewModelLiveData;
/**
* Dome
*/
public class DomeInfo {
private String phone_str;
private String pwd_str;
public DomeInfo(String phone_str, String pwd_str) {
this.phone_str = phone_str;
this.pwd_str = pwd_str;
}
public DomeInfo() {
}
public String getPhone_str() {
return phone_str;
}
public void setPhone_str(String phone_str) {
this.phone_str = phone_str;
}
public String getPwd_str() {
return pwd_str;
}
public void setPwd_str(String pwd_str) {
this.pwd_str = pwd_str;
}
}
이상 의 안 드 로 이 드-뷰 모델 과 라 이브 데이터 사용 에 대한 상세 한 설명 은 바로 편집장 이 여러분 에 게 공유 한 모든 내용 입 니 다.여러분 께 참고 가 되 고 저희 도 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.