#8 MutableLiveData 정~말 쉬운 예제

앱을 제작하다 보면 ...

변수 값의 변경을 탐지하면 편할 때가 무조건 있다.
옵저버 패턴을 사용하면 되겠지만, 구현 자체가 복잡하기도 하고... 사용 빈도가 낮은 부분에 클래스를 두 개씩 붙여가면서 구현하기는 뭔가 지저분하기도 하고...

그러다 만나는게 MutableLiveData 이긴 한데 ...

공식 문서를 살펴보아도 이해가 잘 가지 않게 써놓았기도 했고, 각종 블로그를 돌아다녀보아도 그 예제가 조금은 난해하고 복잡한 것이 필자의 생각이다.

사실 나는 앱 개발을 처음 공부할 때부터 길이가 긴 예제를 보면 생각이 많아졌다.

'왜 이렇게 길고 복잡하게 쓰지?'
'라이브러리를 썼는데 왜 이렇게 코드가 길지?'
'아무리 생각해봐도 별 거 아닌 기능인 것 같은데 왜 이렇게 구현을 거창하게 하는 거지?'

나한텐 옵저버 패턴이 딱 그랬다.

그래서 처음에는

옵저버 패턴이 굉장히 난해하고 지저분해서 패스. MutableLiveData 는 구현이 복잡하다고 생각해서 패스.
그래서 도달한 결론이 Thread 였다. Thread 에 sleep 을 500~1000ms 로 걸어두고 while(true) 해버리는 것이었다. 굉장히 무식하고 성능이 떨어지는 방법이었지만, 달리 방법이 없었다는 핑계를 대고싶다.

각 잡고 MutableLiveData 를 뜯어보았는데

웬 걸? 너무너무너무 간단했다.

public class MainActivity extends AppCompatActivity {
    private MutableLiveData<String> m_data = new MutableLiveData<>();
    // 그냥 이렇게 선언, 초기화 해주고!
        @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
    
           if (!m_data.isEmpty()) { // Null Check 딱 해주고!
           		Log.d("LOG", m_data.getValue());  // 로그 찍어주고!
           }
           
        m_data.observe(MainActivity.this, new Observer<String>() {
            @Override
            public void onChanged(String string) { 
               Log.d("LOG", m_data.getValue()); // 결과 확인을 위해 로그를 찍어주고!

            }
        });
        
         button.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        m_data.setValue("Change"); // setValue() 해주면!
                    }
                });
        

정말 너무 쉽다!

과정은 이러하다.

  • MutableLiveData 를 선언 및 초기화
  • observe 메소드를 통해 onChanged 콜백 메소드에 todo (developer) 정의.
  • Action (해당 예제에서는 button 의 onClick()) 에 MutableLiveData 의 setValue 메소드 구현.

이게 끝이다. setValue 메소드를 통해 MutableLiveData 의 값이 변경되면 onChanged 메소드가 콜백으로 호출되는 형태이다.

주의사항

단, setValue() 는 main Thread 에서 호출하여야 한다. 다른 Thread 에서 MutableLiveData 의 값을 변경하고자 하는 경우에는 postValue() 를 사용하면 된다.

좋은 웹페이지 즐겨찾기