Android-ViewModel 과 LiveData 사용 에 대한 자세 한 설명

ViewModel 류 의 디자인 목적 은 UI 와 관련 된 데 이 터 를 라 이 프 사이클 에 주목 하 는 방식 으로 저장 하고 관리 하 는 것 이다.
예 를 들 어 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;
 }
}
이상 의 안 드 로 이 드-뷰 모델 과 라 이브 데이터 사용 에 대한 상세 한 설명 은 바로 편집장 이 여러분 에 게 공유 한 모든 내용 입 니 다.여러분 께 참고 가 되 고 저희 도 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기