Android application development 第22章:MVVMアーキテクチャ(Model-View-ViewModel)

🔧 なぜMVVMを使うのか?

Android開発では、UIとロジックが密結合になりやすいため、規模が大きくなると保守が難しくなります。

MVVMは以下のような悩みを解消します:

  • ActivityやFragmentが肥大化する(God Class)
  • テストしづらい
  • 再利用性が低い

🧱 MVVMの3つの要素

要素説明
Modelデータやビジネスロジック。たとえば、DBアクセスやAPI通信など。
ViewUI(ActivityやFragment)。基本的にユーザーへの表示と操作の受け付けを担当。
ViewModelUI向けのデータ保持&変換。Modelからデータを取得し、Viewに渡す中間役。UIのロジックもここに集約。

📦 構成のイメージ(図)

[ View (Activity / Fragment) ]
         ↑        ↕
    DataBinding   |
         ↓        |
[ ViewModel (UI状態・処理) ]
         ↓
[ Model (DB/APIなど) ]

✅ サンプル:TODOリスト風の簡易構成

Model層(データ取得)

public class TaskRepository {
    public List<String> getTasks() {
        return Arrays.asList("買い物", "宿題", "読書");
    }
}

ViewModel層

public class TaskViewModel extends ViewModel {
    private final MutableLiveData<List<String>> tasks = new MutableLiveData<>();
    private final TaskRepository repository = new TaskRepository();

    public LiveData<List<String>> getTasks() {
        return tasks;
    }

    public void loadTasks() {
        tasks.setValue(repository.getTasks());
    }
}

View層(Activity)

public class MainActivity extends AppCompatActivity {
    private TaskViewModel viewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

        viewModel = new ViewModelProvider(this).get(TaskViewModel.class);
        binding.setViewModel(viewModel);
        binding.setLifecycleOwner(this);

        viewModel.loadTasks(); // データ読み込み
    }
}

XML(activity_main.xml

<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable name="viewModel" type="com.example.TaskViewModel"/>
    </data>
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text='@{viewModel.tasks[0]}' />
    </LinearLayout>
</layout>

🎯 MVVMで意識すべきポイント

  • ViewModelにUIの状態とロジックを集約
  • Modelは外部との接点(DB, API)に集中
  • Viewはできるだけ表示だけに徹する

📝 補足:JavaでMVVMを書く場合の注意点

  • DataBindingはKotlinと比べるとJavaではやや冗長になりがちですが、十分実用的です。
  • LiveData を使えば、状態の監視が簡単になります(コールバック地獄から脱出)。
  • ViewModelProvider で ViewModel を適切にスコープ管理しましょう。

mh

Related Posts

Android application development 第33章:実践ミニアプリ:天気情報アプリ

Android application development 第32章:実践ミニアプリ:シンプルなToDoリスト

You Missed

Kubernetes Learning 第40章:Kubernetesのアップグレードとバージョン管理 ~安全にバージョンを上げるための基本知識~

  • 投稿者 mh
  • 6月 24, 2025
  • 88 views

Google Cloud Platform エンジニア向け教科書:実践から認定まで : 第13章:ストレージとデータベースの基礎 : オブジェクトストレージ: Cloud Storage(バケット、オブジェクト、ストレージクラス)- あなたの「データ置き場」

  • 投稿者 mh
  • 6月 23, 2025
  • 101 views

Kubernetes Learning 第39章:CRD(Custom Resource Definition)とは?~Kubernetesに“自分専用のリソース”を追加する仕組み~

  • 投稿者 mh
  • 6月 21, 2025
  • 102 views

Google Cloud Platform エンジニア向け教科書:実践から認定まで : 第12章:Cloud CDN(Content Delivery Network):あなたのWebサイトを「世界中のユーザーに超高速で届ける宅配便ネットワーク」

  • 投稿者 mh
  • 6月 20, 2025
  • 119 views

Kubernetes Learning 第38章:Operatorとは? ~Kubernetesに「運用の自動化ロボット」を組み込む仕組み~

  • 投稿者 mh
  • 6月 19, 2025
  • 111 views

Google Cloud Platform エンジニア向け教科書:実践から認定まで : 第11章:Cloud Load Balancing:あなたのGCPリソースを「賢く振り分ける交通整理の達人」

  • 投稿者 mh
  • 6月 18, 2025
  • 123 views