Jetpack LiveDataの活用

LiveDataはAndroidアプリケーションにおいて、ライフサイクルに応じたデータの観測と更新を行うためのクラスです。通常の観測可能なオブジェクトとは異なり、LiveDataはアクティビティやフラグメントといったコンポーネントのライフサイクルと連携します。これにより、UIがアクティブな状態でのみデータの更新を反映することが可能になります。

この仕組みにより、LiveDataには以下のような利点があります:

  • UIとデータの状態を常に同期させる
  • メモリリークの回避が可能
  • アクティビティが停止してもクラッシュしない
  • ライフサイクルの手動管理が不要

LiveDataを含むViewModelの実装


package com.example.livedatatest;

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

public class CounterViewModel extends ViewModel {
    private static MutableLiveData<Integer> likeCount;

    public MutableLiveData<Integer> getLikeCount() {
        if (likeCount == null) {
            likeCount = new MutableLiveData<>();
            likeCount.setValue(0);
        }
        return likeCount;
    }

    public static void updateCount(int delta) {
        likeCount.setValue(likeCount.getValue() + delta);
    }
}

アクティビティでのLiveDataの使用方法


package com.example.livedatatest;

import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProviders;

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

public class MainActivity extends AppCompatActivity {
    private CounterViewModel counterViewModel;
    private TextView displayText;
    private ImageButton incrementButton, decrementButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        displayText = findViewById(R.id.textView);
        incrementButton = findViewById(R.id.imageButton);
        decrementButton = findViewById(R.id.imageButton2);

        counterViewModel = ViewModelProviders.of(this).get(CounterViewModel.class);

        counterViewModel.getLikeCount().observe(this, new Observer<Integer>() {
            @Override
            public void onChanged(Integer value) {
                displayText.setText(String.valueOf(value));
            }
        });

        incrementButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                CounterViewModel.updateCount(1);
            }
        });

        decrementButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                CounterViewModel.updateCount(-1);
            }
        });
    }
}

タグ: Android Jetpack LiveData ViewModel UI同期

7月24日 00:21 投稿