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);
}
});
}
}