android MVVM框架demo

简单的说明一下

M model 层 做数据请求,处理

V view层 简单来说就是所有的Activit的View或者Fragment的View

VM viewModel 上联Model 下联view

简单来说 就是V 要显示什么。告诉VM .VM告诉M .M拿到数据给到VM,VM再把数据给到V

               或者 M数据有变化。告诉VM .VM传递给V

VM 是如何通知V的呢。这里我使用的是MutableLiveData<>()这个类

       View 所有要要到数据对象都在VM声明。View持有VM.View层通过observe观察数据变化。如下图

 
 

Model 如何VM交互呢。我这边是通过接口完成

   VM 持有Model对象。VM主动调用Model层方法。对于一些异步操作,我这里通常使用的接口

    VM设置接口给Mode。其实也可以用kotlin协程来处理

我的总体思路就是 view层作为主动方 主动去调用VM层方法。VM层去调用Model层的方法

View 持有VM 对象。VM持有Model 对象

这是我的项目结构

这是View基类

abstract class BaseActivity<VM : ViewModel, VB : ViewBinding>(
    private val viewModelClass: Class<VM>?,
    private val inflate: (LayoutInflater) -> VB,
) : AppCompatActivity() {

    protected lateinit var binding: VB


    protected val loadingDialog by lazy {
        LoadingDialog()
    }
    protected val viewModel by lazy {
        val viewModelProvider = ViewModelProvider(this)
        viewModelClass?.let {
            viewModelProvider[it]
        }


    }

    override fun onCreate(savedInstanceState: Bundle?) {
        WindowCompat.setDecorFitsSystemWindows(window, false)

        super.onCreate(savedInstanceState)
        binding = inflate(layoutInflater)
        setContentView(binding.root)

        PublicViewModel.tokenState.observe(this) {
            if ((PublicViewModel.TokenState.INVALID == it) and (PublicViewModel.isLoginEd.value == true)) {
                startActivity(Intent(this, LoginActivity::class.java))
                finish()
            }

        }

        PublicViewModel.loadingState.observe(this) {
            if (it == PublicViewModel.LoadingState.LOAD_SHOW) {
                loadingDialog.show(supportFragmentManager)
                PublicViewModel.loadingState.value= PublicViewModel.LoadingState.LOADING
            } else if (it == PublicViewModel.LoadingState.LOAD_HIDE) {
                loadingDialog.dismissAllowingStateLoss()
                PublicViewModel.loadingState.value= PublicViewModel.LoadingState.IDEAL

            }
        }

        toRefreshUI(viewModel)
    }



    abstract fun toRefreshUI(viedModel: VM?)





    override fun onDestroy() {
        super.onDestroy()
        if (PublicViewModel.loadingState.value == PublicViewModel.LoadingState.LOADING) {
            loadingDialog.dismissAllowingStateLoss()
            PublicViewModel.loadingState.value= PublicViewModel.LoadingState.IDEAL
        }
    }


}

viewModel 的基类

package com.zhongjinkang.rhythm.viewModel

import androidx.lifecycle.*
import com.zhongjinkang.rhythm.Model.BaseModel

//VM 层
open  abstract  class BaseViewModel<Model:BaseModel>(
    protected val model:Model?,

): ViewModel() {





//
//    override fun addCloseable(closeable: Closeable) {
//        super.addCloseable(closeable)
//    }
//
//    override fun onCleared() {
//        super.onCleared()
//    }
//
//    //生命周期管理
//    fun onAny(owner: LifecycleOwner?, event: Lifecycle.Event?) {
//
//    }



}

这是项目地址。感兴趣的可以看一下

mvvmDemo: Android mvvm练习demo

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是一个简单的Android MVVM框架的示例: 1. 创建一个Model类,例如User.java,包含用户的姓名和年龄属性。 ``` public class User { private String name; private int age; public User(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } } ``` 2. 创建一个ViewModel类,例如UserViewModel.java,用于处理用户数据的逻辑。 ``` public class UserViewModel { private User user; public UserViewModel(User user) { this.user = user; } public String getUserName() { return user.getName(); } public String getUserAge() { return String.valueOf(user.getAge()); } } ``` 3. 创建一个View类,例如MainActivity.java,用于显示用户数据。 ``` public class MainActivity extends AppCompatActivity { private TextView nameTextView; private TextView ageTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); nameTextView = findViewById(R.id.nameTextView); ageTextView = findViewById(R.id.ageTextView); User user = new User("张三", 20); UserViewModel userViewModel = new UserViewModel(user); nameTextView.setText(userViewModel.getUserName()); ageTextView.setText(userViewModel.getUserAge()); } } ``` 4. 在布局文件activity_main.xml中添加两个TextView控件用于显示用户数据。 ``` <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/nameTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="姓名:" /> <TextView android:id="@+id/ageTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="年龄:" /> </LinearLayout> ``` 以上就是一个简单的Android MVVM框架的示例,其中Model类用于存储数据,ViewModel类用于处理数据逻辑,View类用于显示数据。通过这种方式,可以将数据和逻辑分离,使得代码更加清晰和易于维护。 ### 回答2: AndroidMVVM 框架是一种用于构建现代化、可维护性高的应用程序的框架MVVM 框架中实现了模型、视图、视图模型三者之间的解耦,可以更好地分离应用逻辑和视图逻辑,提高代码的可重用性、可测试性以及可扩展性。 下面为大家介绍一个简单的 MVVM 框架demo,以方便理解和学习。 在这个 demo 中,我们将展示一张图片,并在下方的文本框中显示此图片的宽度和高度。我们将使用以下两个库(依赖关系请自行添加): - Retrofit: 用于从网络上下载图片 - Glide: 用于将图片显示在 ImageView 中 1. 创建模型层 在这个例子中,我们只需要一个简单的模型,表示图片的宽度和高度。我们定义一个名为 ImageInfo 的类,包含两个成员变量(width 和 height),以及一些访问这些变量的方法: ```kotlin data class ImageInfo(val width: Int, val height: Int) { fun getWidthString() = "Width: ${width}px" fun getHeightString() = "Height: ${height}px" } ``` 2. 创建视图模型层 我们的视图模型将包括一个用于从网络加载图片并提取其信息(宽度和高度)的 Retrofit 服务。我们通过创建一个名为 ImageViewModel 的类来实现这个过程。在 ImageViewModel 的构建函数中,我们创建了一个 Retrofit 实例,并从网络中获取图片。图片下载完成后,我们调用 Glide 的 loadImage 方法将其加载到 ImageView 中并提取其信息。我们将这些信息存储在 imageInfo 变量中。 ```kotlin class ImageViewModel(private val networkService: NetworkService) : ViewModel() { val imageInfo: LiveData<ImageInfo> = MutableLiveData() init { networkService.getImageFromNetwork() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ bitmap -> val width = bitmap.width val height = bitmap.height val info = ImageInfo(width, height) imageInfo.postValue(info) Glide.with(imageView).load(bitmap).into(imageView) }, { throwable -> Log.d("Demo", throwable.localizedMessage) }) } } ``` 3. 创建视图层 在视图层中,我们使用 DataBinding 和 MVVM 架构来设计应用程序的界面。我们将设计一个名为 activity_main.xml 的布局文件,在其中包含一个 ImageView 和一个 TextView。我们使用 DataBinding 来绑定 ImageView 和 TextView 的值。 ```xml <layout> <LinearLayout> <ImageView android:id="@+id/image_view" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" app:imageUrl="@{viewModel.imageInfo}" /> <TextView android:id="@+id/text_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@{viewModel.imageInfo.getWidthString() + '\n' + viewModel.imageInfo.getHeightString()}" /> </LinearLayout> </layout> ``` 4. 在 MainActivity 中使用 MVVM 架构 在 MainActivity 类中,我们创建一个名为 ImageViewModel 的成员变量,并在 onCreate 方法中为其实例化。我们还使用 DataBindingUtil 绑定 MainActivity 的布局文件,并将 ImageViewModel 的实例传递给它的 ViewModelStoreOwner。 ```kotlin class MainActivity : AppCompatActivity() { private lateinit var viewModel: ImageViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main) viewModel = ViewModelProviders.of(this).get(ImageViewModel::class.java) binding.viewModel = viewModel binding.lifecycleOwner = this } } ``` 至此,我们已完成了一个简单的 MVVM 框架demo。通过以上的例子,我们可以看到 MVVM 架构的优势,例如: - 更好的代码分离和模块化 - 更好的可测试性和可维护性 - 更好的逻辑重用和扩展性 完整的代码示例可在 Github 上查看,欢迎大家参考和学习。 ### 回答3: Android MVVM框架(Model-View-ViewModel)是一种设计模式,在这个模式中,将UI和业务逻辑分开,将数据和视图之间的通信封装在一个ViewModel层中。这样可以使得代码更加清晰易懂,便于维护和扩展。 这里提供一个简单的MVVM demo来展示这种架构的基本结构和工作原理。 在这个demo中,模拟用户登录的场景。首先是Model层,里面定义了一个User类,用来存储用户的账号和密码。下面是User类的代码: ``` public class User { private String username; private String password; public User(String username, String password) { this.username = username; this.password = password; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } ``` 接下来是ViewModel层,这里定义了一个LoginViewModel类,其中定义了一个login方法,用来处理用户登录的逻辑。当用户输入账号和密码后,ViewModel会通过model层的数据来验证用户信息,如果验证成功,则返回一个登录成功的结果,否则返回一个错误信息。下面是LoginViewModel类的代码: ``` public class LoginViewModel { private final MutableLiveData<String> resultLiveData = new MutableLiveData<>(); public LiveData<String> getResultLiveData() { return resultLiveData; } public void login(String username, String password) { if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password)) { resultLiveData.setValue("请输入用户名和密码"); } else if (username.equals("admin") && password.equals("123")) { resultLiveData.setValue("登录成功"); } else { resultLiveData.setValue("用户名或密码错误"); } } } ``` 注意到这里我们使用了LiveData对象来封装了我们的返回结果,这样能够使得UI层在数据发生变化的时候及时收到通知。 最后是View层,这里使用了一个Activity来展示UI界面,并且使用DataBinding将View和ViewModel之间的绑定关系进行了处理。下面是LoginActivity类的代码: ``` public class LoginActivity extends AppCompatActivity { private final LoginViewModel viewModel = new LoginViewModel(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActivityLoginBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_login); binding.setLifecycleOwner(this); binding.setViewModel(viewModel); viewModel.getResultLiveData().observe(this, s -> { Toast.makeText(this, s, Toast.LENGTH_SHORT).show(); }); } } ``` 我们在这个Activity中使用了DataBinding来绑定ViewModel,并且监听了ViewModel结果的返回信息,当ViewModel返回了结果后,我们通过Toast来展示这个结果。 以上就是一个简单的MVVM demo,通过这个demo可以发现,使用MVVM框架来设计和实现应用程序是非常方便和高效的,可以将UI、业务逻辑和数据层解耦,使得代码更加容易维护和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值