Android AAC

Android AAC : LiveData

Machine_웅 2021. 1. 7. 10:53
728x90
반응형

 

 

developer.android.com/topic/libraries/architecture/livedata?hl=ko

 

LiveData 개요  |  Android 개발자  |  Android Developers

LiveData를 사용하여 수명 주기를 인식하는 방식으로 데이터를 처리합니다.

developer.android.com

LiveData 란?

LiveData는 식별 가능한 데이터 홀더 클래스입니다.

식별 가능한 일반 클래스와 달리 LiveData는 수명 주기를 인식합니다.

즉 활동, 프래그먼트 또는 서비스와 같은 다른 앱 구성요소의 수명 주기를 고려합니다.

이러한 수명 주기 인식을 통해 LiveData는 활성 수명 주기 상태에 있는 앱 구성요소 관찰자만 업데이트합니다.

 

* Observer 클래스로 표현되는 관찰자의 수명 주기가 STARTED 또는 RESUMED 상태

* 관찰자에 대응되는 Lifecycle 객체의 상태가 DESTROYED로 변경될 때 관찰자를 삭제

 

 

LiveData 사용의 이점

1) UI와 데이터 상태의 일치 보장

 LiveData는 관찰자 패턴을 따릅니다.

 LiveData는 수명 주기 상태가 변경될 때 Observer 객체에 알립니다.

 코드를 통합하여 이러한 Observer 객체에 UI를 업데이트할 수 있습니다.

 앱 데이터가 변경될 때마다 UI를 업데이트하는 대신,

 변경이 발생할 때마다 관찰자가 UI를 업데이트할 수 있습니다.

 

2) 메모리 누출 없음

 관찰자는 Lifecycle 객체에 결합되어 있으며 연결된 수명 주기가 끝나면 자동으로 삭제됩니다.

 

3) 중지된 활동으로 인한 비정상 종료 없음

 관찰자의 수명 주기가 비활성 상태(예: 활동이 백 스택에 있음)이면 관찰자는 어떤 LiveData 이벤트도 수신하지 않습니다.

 

4) 수명 주기를 더 이상 수동으로 처리하지 않음

 UI 구성요소는 관련 데이터를 관찰하기만 할 뿐 관찰을 중지하거나 다시 시작하지 않습니다.

 LiveData는 관찰하는 동안 관련 수명 주기 상태의 변경을 인식하므로 이 모든 것을 자동으로 관리합니다.

 

5) 최신 데이터 유지

 수명 주기가 비활성화되면 다시 활성화될 때 최신 데이터를 수신합니다.

 예를 들어 백그라운드에 있었던 활동은 포그라운드로 돌아온 직후 최신 데이터를 받습니다.

 

6) 적절한 구성 변경

 구성 변경(예: 기기 회전)으로 인해 활동이나 프래그먼트가 다시 생성되면 사용할 수 있는 최신 정보를 즉시 수신합니다.

 

7) 리소스 공유

 앱에서 시스템 서비스를 공유할 수 있도록 싱글톤 패턴을 사용하는 LiveData 객체를 확장하여

 시스템 서비스를 래핑할 수 있습니다. 

 LiveData 객체가 시스템 서비스에 한 번 연결되면 리소스가 필요한 모든 관찰자가 LiveData 객체를 볼 수 있습니다.

 자세한 내용은 LiveData 확장을 참조하세요.

 

 

LiveData 객체로 작업

1) 특정 유형의 데이터를 보유할 LiveData의 인스턴스를 생성합니다.

   이 작업은 일반적으로 ViewModel 클래스 내에서 이루어집니다.

 

2) onChanged() 메서드를 정의하는 Observer 객체를 생성합니다.

  이 메서드는 LiveData 객체가 보유한 데이터 변경 시 발생하는 작업을 제어합니다.

  일반적으로 활동이나 프래그먼트 같은 UI 컨트롤러에 Observer 객체를 생성합니다.

 

3) observe() 메서드를 사용하여 LiveData 객체에 Observer 객체를 연결합니다. 

   observe() 메서드는 LifecycleOwner 객체를 사용합니다.

   이렇게 하면 Observer 객체가 LiveData 객체를 구독하여 변경사항에 관한 알림을 받습니다.

   일반적으로 활동이나 프래그먼트와 같은 UI 컨트롤러에 Observer 객체를 연결합니다.

 

참고: observeForever(Observer) 메서드를 사용하여 연결된 LifecycleOwner 객체가 없는 관찰자를 등록할 수 있습니다.이 경우 관찰자는 항상활성 상태로 간주되므로 항상 수정 관련 알림을 받습니다. removeObserver(Observer) 메서드를 호출하여 이러한 관찰자를 삭제할 수 있습니다.

 4) LiveData 객체에 저장된 값을 업데이트하면

    연결된 LifecycleOwner가 활성 상태에 있는 한 등록된 모든 관찰자가 트리거됩니다.

 

5) LiveData를 사용하면 UI 컨트롤러 관찰자가 업데이트를 구독할 수 있습니다. 

    LiveData 객체에서 보유한 데이터가 변경되면 응답으로 UI가 자동 업데이트됩니다.

 

 

1) 객체 만들기

- LiveData는 List와 같은 Collections를 구현하는 객체를 비롯하여 모든 데이터와 함께 사용할 수 있는 래퍼입니다.

- LiveData 객체는 일반적으로 ViewModel 객체 내에 저장되며 다음 예에서 보는 것과 같이 getter 메서드를 통해 액세스됩니다.

package com.woongs.woongsProject.View_Model;

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

public class NameViewModel extends ViewModel {

    // Create a LiveData with a String
    private MutableLiveData<String> currentName;

    public MutableLiveData<String> getCurrentName() {
        if (currentName == null) {
            currentName = new MutableLiveData<String>();
        }
        return currentName;
    }

    // Rest of the ViewModel...
}
 ViewModel 가이드를 참조하세요.

 

2) LiveData 객체 관찰

-  onCreate() 메서드는 LiveData 객체 관찰을 시작하기 적합 ( onResume() 메서드에서 중복 호출을 하지 않도록 하기 위해서 )

일반적으로 LiveData는 데이터가 변경될 때만, 그리고 활성 관찰자에게만 업데이트를 전달합니다.

   이 동작의 예외로, 관찰자가 비활성 상태에서 활성 상태로 변경될 때에도 관찰자는 업데이트를 받습니다.

   또한 관찰자가 비활성 상태에서 활성 상태로 다시 변경되면 마지막으로 활성 상태가 된 이후

   값이 변경된 경우에만 업데이트를 받습니다.

public class LiveData_Main extends AppCompatActivity {
    private NameViewModel model;

    TextView nameTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_live_data_main);
        nameTextView = findViewById(R.id.nameTextView);

        // Get the ViewModel.
        model = new ViewModelProvider(this).get(NameViewModel.class);

        // Create the observer which updates the UI.
        final Observer<String> nameObserver = new Observer<String>() {
            @Override
            public void onChanged(@Nullable final String newName) {
                // Update the UI, in this case, a TextView.
                nameTextView.setText(newName);
            }
        };

        // Observe the LiveData, passing in this activity as the LifecycleOwner and the observer.
        model.getCurrentName().observe(this, nameObserver);
    }
}

 nameObserver를 매개변수로 전달하여 observe()를 호출하면

 onChanged()가 즉시 호출되어 mCurrentName에 저장된 가장 최신 값을 제공합니다.

 LiveData 객체가 mCurrentName에 값을 설정하지 않았다면 onChanged()는 호출되지 않습니다.

 

3) LiveData 객체 업데이트

-  LiveData에는 저장된 데이터를 업데이트하는 데 공개적으로 사용할 수 있는 메서드가 없습니다

  MutableLiveData 클래스는 setValue(T)  postValue(T) 메서드를 공개 메서드로 노출하며

  LiveData 객체에 저장된 값을 수정하려면 이러한 메서드를 사용해야 합니다.

 

 일반적으로 MutableLiveData는 ViewModel에서 사용되며 

 ViewModel은 변경이 불가능한 LiveData 객체만 관찰자에게 노출합니다.

    button.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            String anotherName = "John Doe";
            model.getCurrentName().setValue(anotherName);
        }
    });

 

 

 

 

전체소스

 

ViewModel 

package com.woongs.woongsProject.View_Model;

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

public class NameViewModel extends ViewModel {

    // Create a LiveData with a String
    private MutableLiveData<String> currentName;

    public MutableLiveData<String> getCurrentName() {
        if (currentName == null) {
            currentName = new MutableLiveData<String>();
        }
        return currentName;
    }

    // Rest of the ViewModel...
}

LiveData_Main

package com.woongs.woongsProject;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.woongs.woongsProject.View_Model.NameViewModel;

public class LiveData_Main extends AppCompatActivity {
    private NameViewModel model;

    TextView nameTextView;
    Button btn_1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_live_data_main);
        nameTextView = findViewById(R.id.nameTextView);
        btn_1 = findViewById(R.id.btn_1);

        // Get the ViewModel.
        model = new ViewModelProvider(this).get(NameViewModel.class);

        // Create the observer which updates the UI.
        final Observer<String> nameObserver = new Observer<String>() {
            @Override
            public void onChanged(@Nullable final String newName) {
                // Update the UI, in this case, a TextView.
                nameTextView.setText(newName);
            }
        };

        // Observe the LiveData, passing in this activity as the LifecycleOwner and the observer.
        model.getCurrentName().observe(this, nameObserver);

        btn_1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String anotherName = "John Doe";
                model.getCurrentName().setValue(anotherName);
            }
        });
    }
}


xml

728x90
반응형

'Android AAC' 카테고리의 다른 글

DATA_Binding : Fragment  (0) 2022.03.10
MVVM LiveData (1)  (0) 2021.02.22
Android ACC : Data Binding  (0) 2021.01.06
Android ACC : Lifecycles  (0) 2021.01.06
Android AAC 란?  (0) 2021.01.06