Jetpack架构组件_ViewModel组件_1.简介和示例

诗林  金牌会员 | 2024-9-30 15:19:18 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 720|帖子 720|积分 2160

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1.简介

       ViewModel是我们MVVM中的VM层,ViewModel类似于MVP中的P层,它是我们View层和Model层之间的一个桥梁。
1.1 和MVP的P层的紧张区别是:

(1)ViewModel是与我们Android系统挂钩的,是官方的一个类,MV之间的一个桥梁。
(2)ViewModel还保持数据。
1.2 Android为什么要引入ViewModel? 

(1)分层,便于测试和维护;
(2)ViewModel办理了横竖切换时数据丢失的问题。ViewModel生命周期比力长一些,不受横竖屏切换Activity生命周期的影响。
(3)避免因疏忽而导致的内存泄漏。onCleared里,写一些释放资源的代码。
1.3 Viewmodel生命周期

         Viewmodel生命周期可以参考官网地点:
ViewModel 概览  |  Android Developers
        图 1 说明了 activity 履历屏幕旋转而后结束时所处的各种生命周期状态。该图还在关联的 activity 生命周期的旁边显示了 ViewModel 的生命周期。此图表说明了 activity 的各种状态。这些根本状态同样适用于 fragment 的生命周期。

图1 ViewModel的生命周期

        通常在系统首次调用 activity 对象的 onCreate() 方法时请求 ViewModel。系统可能会在 activity 的整个生命周期内多次调用 onCreate(),如在旋转设备屏幕时。ViewModel 存在的时间范围是从首次请求 ViewModel 直到 activity 完成并销毁。
 2.代码示例

 2.1新建工程

        选Empty Views Activity。 

项目名:ViewModelDemo ,语言:Java。

 2.2  Activity界说变量

        在activity中界说变量,每次旋转屏幕后会丢失。
        MainActivity.java代码:
  1. package com.gaoting.viewmodeldemo;
  2. import android.os.Bundle;
  3. import android.util.Log;
  4. import android.view.View;
  5. import android.widget.Button;
  6. import android.widget.TextView;
  7. import androidx.appcompat.app.AppCompatActivity;
  8. public class MainActivity extends AppCompatActivity {
  9.     int score;
  10.     TextView tvScore;
  11.     Button btAddScore;
  12.     String TAG = "MainActivity";
  13.     @Override
  14.     protected void onCreate(Bundle savedInstanceState) {
  15.         super.onCreate(savedInstanceState);
  16.         setContentView(R.layout.activity_main);
  17.         tvScore = this.findViewById(R.id.tvScore);
  18.         btAddScore = this.findViewById(R.id.btAddScore);
  19.         btAddScore.setOnClickListener(new View.OnClickListener() {
  20.             @Override
  21.             public void onClick(View v) {
  22.                 score++;
  23.                 tvScore.setText(String.valueOf(score));
  24.             }
  25.         });
  26.         Log.i(TAG,"onCreate");
  27.     }
  28.     @Override
  29.     protected void onDestroy() {
  30.         Log.i(TAG,"onDestroy");
  31.         super.onDestroy();
  32.     }
  33. }
复制代码
        activity_main.xml代码:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     xmlns:app="http://schemas.android.com/apk/res-auto"
  4.     xmlns:tools="http://schemas.android.com/tools"
  5.     android:id="@+id/main"
  6.     android:layout_width="match_parent"
  7.     android:layout_height="match_parent"
  8.     tools:context=".MainActivity">
  9.     <TextView
  10.         android:id="@+id/tvScore"
  11.         android:layout_width="wrap_content"
  12.         android:layout_height="wrap_content"
  13.         android:text="成绩:0"
  14.         app:layout_constraintBottom_toBottomOf="parent"
  15.         app:layout_constraintLeft_toLeftOf="parent"
  16.         app:layout_constraintRight_toRightOf="parent"
  17.         app:layout_constraintTop_toTopOf="parent" />
  18.     <Button
  19.         android:layout_marginTop="30dp"
  20.         app:layout_constraintTop_toBottomOf="@+id/tvScore"
  21.         app:layout_constraintLeft_toLeftOf="parent"
  22.         app:layout_constraintRight_toRightOf="parent"
  23.         android:text="点我+1"
  24.         android:id="@+id/btAddScore"
  25.         android:layout_width="wrap_content"
  26.         android:layout_height="wrap_content"
  27.         tools:ignore="MissingConstraints"
  28.         />
  29. </androidx.constraintlayout.widget.ConstraintLayout>
复制代码

        运行效果:
        点击button,效果增加到10,然后旋转屏幕发现效果变成0了。

 2.3变量放在Viewmodel中

         新建MyViewModel类。

         MainActivity.java代码
  1. package com.gaoting.viewmodeldemo;
  2. import android.os.Bundle;
  3. import android.util.Log;
  4. import android.view.View;
  5. import android.widget.Button;
  6. import android.widget.TextView;
  7. import androidx.appcompat.app.AppCompatActivity;
  8. import androidx.lifecycle.ViewModelProvider;
  9. public class MainActivity extends AppCompatActivity {
  10.     TextView tvScore;
  11.     Button btAddScore;
  12.     String TAG = "MainActivity";
  13.     MyViewModel myViewModel;
  14.     @Override
  15.     protected void onCreate(Bundle savedInstanceState) {
  16.         super.onCreate(savedInstanceState);
  17.         setContentView(R.layout.activity_main);
  18.         ViewModelProvider viewModelProvider = new ViewModelProvider(this,new ViewModelProvider.NewInstanceFactory());
  19.         myViewModel = viewModelProvider.get(MyViewModel.class);
  20.         tvScore = this.findViewById(R.id.tvScore);
  21.         tvScore.setText(String.valueOf(myViewModel.getScore()));
  22.         btAddScore = this.findViewById(R.id.btAddScore);
  23.         Log.i(TAG,"score init:"+tvScore.getText() +"vm:"+ myViewModel.getScore());
  24.         btAddScore.setOnClickListener(new View.OnClickListener() {
  25.             @Override
  26.             public void onClick(View v) {
  27.                 myViewModel.addScore();
  28.                 tvScore.setText(String.valueOf(myViewModel.getScore()));
  29.             }
  30.         });
  31.         Log.i(TAG,"onCreate");
  32.     }
  33.     @Override
  34.     protected void onDestroy() {
  35.         Log.i(TAG,"onDestroy");
  36.         super.onDestroy();
  37.     }
  38. }
复制代码
         MyViewModel.java代码:
  1. package com.gaoting.viewmodeldemo;
  2. import android.util.Log;
  3. import androidx.lifecycle.ViewModel;
  4. public class MyViewModel extends ViewModel {
  5.     int score;
  6.     public static final String TAG = "MyViewModel";
  7.     public int getScore() {
  8.         return score;
  9.     }
  10.     public void addScore(){
  11.         score++;
  12.     }
  13.     @Override
  14.     protected void onCleared() {
  15.         Log.i(TAG,"在这儿添加释放资源的代码");
  16.         super.onCleared();
  17.     }
  18. }
复制代码
 运行效果:
        如下图所示,可以看到旋转不会丢失数据。









免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

诗林

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表