MVVM-Day3

【3天快速入门WPF】12-MVVM MVVM是的缩写,是一种用于构建用户界面的设计模式,是一种简化用户界面的事件驱动编程方式。MVVM的目标是实现用户界面和业务逻辑之间的彻底分离,以便更好地管理和维护应用程序,并提供更好的可测试性和可扩展性。MVVMModelModel代表应用程序的数据和业务逻辑。它负责存储和管理数据,并且通常不包含任何与用户界面相关的代码。Model 可以是数据实体、数据库访问类、服务类等。ViewView是用户界面的可视化表示,通常由 XAML 文件定义。它负责展示数据给用户,并捕获用户输入。 阅读详情

Base层框架同Day2创建FoodEntity、Api接口、RetrifitManager管理类

Api接口:

package com.bw.day3.MVVM.Base.Http;

import com.bw.day3.MVVM.Base.Entity.FoodEntity;
import com.bw.day3.MVVM.Base.Entity.UserEntity;

import io.reactivex.Observable;
import okhttp3.RequestBody;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;

public interface Api {

    @GET("foods/getFoods")
    Observable<FoodEntity> getFoodData(@Query("currentPage") int currentPage, @Query("pageSize")int pageSize);

    @POST("user/register")
    Observable<UserEntity> postRegisterData(@Body RequestBody body);

    @POST("user/loginjson")
    Observable<UserEntity> postLoginData(@Body RequestBody body);
}

在Model创建BaseModel

package com.bw.day3.MVVM.Base.Model;

import com.bw.day3.MVVM.Base.Http.Api;
import com.bw.day3.MVVM.Base.Http.RetrifitManager;

public class BaseModel {

    protected Api api;

    public BaseModel() {
        api= RetrifitManager.getInstance().creatrRetrofit().create(Api.class);
    }

}

在ViewModel包中创建BaseViewModel:

package com.bw.day3.MVVM.Base.ViewModel;

import androidx.lifecycle.ViewModel;

import com.bw.day3.MVVM.Base.Model.BaseModel;

public abstract class BaseViewModel <BaMo extends BaseModel>extends ViewModel {

    protected BaMo bModel;

    public BaseViewModel() {
        bModel=creatModel();
    }

    protected abstract BaMo creatModel();

}

创建BaseActivity:

package com.bw.day3.MVVM.Base.View;

import android.os.Bundle;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.databinding.ViewDataBinding;
import androidx.lifecycle.ViewModelProvider;

import com.bw.day3.MVVM.Base.ViewModel.BaseViewModel;

public abstract class BaseActivity <VDB extends ViewDataBinding ,VM extends BaseViewModel>extends AppCompatActivity {

    protected VDB viewDataBinding;
    protected VM viewModel;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        viewDataBinding= DataBindingUtil.setContentView(this, getLayoutid());
        viewModel=new ViewModelProvider(this).get(getViewModel());
        initView();
        initData();
        handObserver();
    }

    protected abstract Class<VM> getViewModel();

    protected abstract int getLayoutid();

    protected abstract void initView();

    protected abstract void initData();

    protected void handObserver() {

    }

}

Food应用层创建Food包:

创建FoodModel继承BaseModel:

package com.bw.day3.MVVM.Food;

import com.bw.day3.MVVM.Base.Entity.FoodEntity;
import com.bw.day3.MVVM.Base.Model.BaseModel;

import io.reactivex.Observable;

public class FoodModel extends BaseModel {

    public Observable<FoodEntity> getFoodData(int currentPage,int pageSize){
        return api.getFoodData(currentPage,pageSize);
    }

}

创建FoodViewModel继承BaseViewModel泛型为FoodModel:

package com.bw.day3.MVVM.Food;

import android.util.Log;

import androidx.lifecycle.MutableLiveData;

import com.bw.day3.MVVM.Base.Entity.FoodEntity;
import com.bw.day3.MVVM.Base.ViewModel.BaseViewModel;

import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;

public class FoodViewModel extends BaseViewModel<FoodModel> {

    public MutableLiveData<FoodEntity> liveData=new MutableLiveData<>();

    @Override
    protected FoodModel creatModel() {
        return new FoodModel();
    }

    public void getFood(int page,int size){
        bModel.getFoodData(page,size)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<FoodEntity>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(FoodEntity foodEntity) {
                        Log.i("TAG", "onNext: "+foodEntity.getData().size());
                        liveData.postValue(foodEntity);
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });
    }
}

创建FoodActivity继承BaseActivity泛型为ActivityFoodBinding,FoodViewModel:

package com.bw.day3.MVVM.Food;

import androidx.recyclerview.widget.LinearLayoutManager;

import com.bw.day3.MVVM.Base.Adapter.FoodAdapter;
import com.bw.day3.MVVM.Base.Entity.FoodEntity;
import com.bw.day3.MVVM.Base.View.BaseActivity;
import com.bw.day3.R;
import com.bw.day3.databinding.ActivityFoodBinding;

import java.util.ArrayList;
import java.util.List;

public class FoodActivity extends BaseActivity<ActivityFoodBinding,FoodViewModel> {


    protected List<FoodEntity.DataBean> list=new ArrayList<>();
    protected FoodAdapter adapter;

    @Override
    protected Class<FoodViewModel> getViewModel() {
        return FoodViewModel.class;
    }

    @Override
    protected int getLayoutid() {
        return R.layout.activity_food;
    }

    @Override
    protected void initView() {
        viewModel.getFood(1,10);
    }

    @Override
    protected void initData() {
        viewDataBinding.rv.setLayoutManager(new LinearLayoutManager(FoodActivity.this));
        viewDataBinding.rv.setAdapter(adapter);;
    }

    @Override
    protected void handObserver() {
        super.handObserver();
        viewModel.liveData.observe(this, foodEntity -> {
            if (foodEntity.getCode()==200){
                list.addAll(foodEntity.getData());
                adapter=new FoodAdapter(R.layout.view_food,list);
                viewDataBinding.rv.setAdapter(adapter);
            }
        });
    }
}

登录注册

先写Model应用层的Model继承BaseModel(方法可从Api中复制):

package com.bw.day3.MVVM.User.Login;

import com.bw.day3.MVVM.Base.Entity.UserEntity;
import com.bw.day3.MVVM.Base.Model.BaseModel;

import io.reactivex.Observable;
import okhttp3.RequestBody;

public class LoginModel extends BaseModel {
    public Observable<UserEntity> postLoginData(RequestBody body){
        return api.postLoginData(body);
    }
}

再写ViewModel(继承BaseViewModel泛型为应用层的Model):

package com.bw.day3.MVVM.User.Login;

import androidx.lifecycle.MutableLiveData;

import com.bw.day3.MVVM.Base.Entity.UserEntity;
import com.bw.day3.MVVM.Base.ViewModel.BaseViewModel;

import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
import okhttp3.RequestBody;

public class LoginViewModel extends BaseViewModel<LoginModel> {

    public MutableLiveData<UserEntity> liveData=new MutableLiveData<>();

    @Override
    protected LoginModel creatModel() {
        return new LoginModel();
    }

    public void postLoginData(RequestBody body){
        bModel.postLoginData(body)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<UserEntity>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(UserEntity userEntity) {
                        liveData.postValue(userEntity);
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });
    }
}

最后写View层Activity

package com.bw.day3.MVVM.User.Login;


import android.content.Intent;
import android.widget.Toast;

import com.bw.day3.MVVM.Base.View.BaseActivity;
import com.bw.day3.MVVM.User.Register.RegisterActivity;
import com.bw.day3.R;
import com.bw.day3.databinding.ActivityLoginBinding;
import com.google.gson.Gson;

import java.util.HashMap;
import java.util.Map;

import okhttp3.MediaType;
import okhttp3.RequestBody;

public class LoginActivity extends BaseActivity<ActivityLoginBinding,LoginViewModel> {


    @Override
    protected Class<LoginViewModel> getViewModel() {
        return LoginViewModel.class;
    }

    @Override
    protected int getLayoutid() {
        return R.layout.activity_login;
    }

    @Override
    protected void initView() {
        viewDataBinding.login.setOnClickListener(v -> {
            String username=viewDataBinding.username.getText().toString().trim();
            String password=viewDataBinding.password.getText().toString().trim();
            Map<String,String> map=new HashMap<>();
            map.put("username",username);
            map.put("password",password);
            String json=new Gson().toJson(map);
            RequestBody requestBody=RequestBody.create(MediaType.parse("application/json;charset=utf-8"),json);
            viewModel.postLoginData(requestBody);
        });
        viewDataBinding.register.setOnClickListener(v -> {
            Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);
            startActivity(intent);
        });
    }

    @Override
    protected void initData() {

    }

    @Override
    protected void handObserver() {
        super.handObserver();
        viewModel.liveData.observe(this, userEntity -> {
            if (userEntity.getCode()==200){
                Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show();
            }else {
                Toast.makeText(this, "登录失败:"+userEntity.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });
    }
}

所需依赖build.gradle中添加:

 viewBinding {
        enabled = true
    }
    dataBinding {
        enabled = true
    }
implementation 'com.google.code.gson:gson:2.8.0'//gson依赖
    //RxJava依赖:主要用于消息传递
    implementation 'io.reactivex.rxjava2:rxjava:2.2.8'
    implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
    //Retrofit依赖
    implementation 'com.squareup.retrofit2:retrofit:2.4.0'
    //Gson converter gson解析
    implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
    //RxJava2 Adapter
    implementation "com.squareup.retrofit2:adapter-rxjava2:2.3.0"
    //okhttp
    implementation 'com.squareup.okhttp3:okhttp:3.4.1'
    implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1'

//rxlifecycle异步线程生命周期管理
    implementation 'com.trello.rxlifecycle2:rxlifecycle-components:2.2.1'

    //rxpermissions
    implementation 'com.github.tbruyelle:rxpermissions:0.10.2'
    implementation 'com.github.bumptech.glide:glide:4.11.0'
    implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.0'//万能适配器
    implementation 'com.android.support:recyclerview-v7:30.0.0'//recyclerview

2026开源API网关横评:微服务与AI流量治理如何选型 API网关作为微服务架构的流量入口,承担着路由转发、安全管控、限流熔断等核心职责,是分布式系统治理的基础设施。随着大模型应用的普及,AI流量对网关提出了新的要求,如流式响应支持、Token级限流、多模型路由和成本分账等能力。传统网关通过插件拼凑AI功能,而AI原生网关则将这些能力内建。面对众多开源方案,如何根据业务场景做出合理选型?本文对Kong、APISIX、Higress、Envoy Gateway、MAI Gateway等主流开源API网关进行横向评测,从性能、动态性、K8s集成度、AI流量治理等维度 阅读详情

相关推荐

芯片设计数字后仿与SDF文件:原理、流程与实战调试指南

在数字芯片设计流程中,时序验证是确保芯片功能正确与性能达标的核心环节。其原理在于通过精确的物理延迟模型,模拟信号在真实硅片上的传播行为,从而暴露理想仿真中无法发现的时序问题。这项技术的核心价值在于它是连接前端逻辑设计与后端物理实现的桥梁,能有效发现建立时间/保持时间违例、时钟偏斜、竞争冒险等关键风险,是保障芯片一次流片成功的关键步骤。其典型应用场景包括高性能计算单元、复杂SoC以及低功耗设计中的状态切换验证。本文聚焦于数字后仿真的具体实施,深入解析SDF文件的结构与反标机制,并提供从环境搭建、波形分析到与静

weixin_34279184的博客 382

前端VUE3.0,DAY6,MVVM模型

VUE3.0,DAY6MVVM模型总结 MVVM模型 1.搭建好基本代码框架,引入vue.js。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=\, init

疯子的梦想@的博客 444

国密证书实战:在CentOS 7上构建GmSSL私有CA与完整证书链

本文详细介绍了在CentOS 7操作系统上,使用GmSSL工具构建私有国密证书颁发机构(CA)与完整证书链的实战指南。内容涵盖从部署GmSSL、创建国密根CA、签发服务器与客户端证书,到生产环境安全加固与最佳实践的全流程,旨在帮助系统管理员和安全工程师建立统一、可控的内部国密安全通信体系。

jenkins8butler的博客 496

专高二 day3(MVVM实现简单的登录注册)

return id;return sex;

2201_75291151的博客 1033

UE4免费资产库新玩法:Quixel Bridge插件安装与Megascans资源导入全攻略

本文详细介绍了如何在UE4中安装Quixel Bridge插件并导入Megascans资源,帮助开发者快速获取高质量3D资产。通过分步教程和实用技巧,提升游戏或影视场景的制作效率,特别适合需要真实感环境的项目。

weixin_27729671的博客 367

双目立体成像(一)双目图片生成点云

利用左右目图片生成点云

qq_62964142的博客 4552

59.[前端开发-Vue3]Day01-Vue初体验-MVVM-模板语法-常用指令

我是按钮

m0_55135449的博客 507

汇川Easy系列PID_AT指令弹簧质量阻尼系统闭环控制仿真测试

汇川Easy系列PLC系统PID指令(温度控制PID应用编程)

RXXW_Dor的博客 764

阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_02-vuejs研究-vuejs基础-MVVM模式...

1.2.1 MVVM模式 vue.js是一个MVVM的框架,理解MVVM有利于学习vue.js。 MVVM拆分解释为: Model:负责数据存储 View:负责页面展示 View Model:负责业务逻辑处理(比如Ajax请求等),对数据进行加工后交给视图展示 MVVM要解决的问题是将业务逻辑代码与视图代码进行完全分离,使各自的职责更加清晰,后期代码维护更 加简单 ...

weixin_30566063的博客 121

java零基础从入门到精通(全)

目录前言1. 入门知识1.1 java体系1.2 JDK/JRE/JVM区别1.3 编译与运行理解1.4 类体函数细节2. 标识符 前言 java优势 健壮性(JVM(C++语言写的一个虚拟的计算机)、GC(垃圾回收机制)) 多线程并发 可移植性/跨平台 1. 入门知识 1.1 java体系 JavaSE:标准版 JavaEE:企业版 JavaME:微型版 1.2 JDK/JRE/JVM区别 JVM是不能独立安装的。 JRE和JDK都是可以独立安装的 层层嵌套,jvm包括jdk,jdk包括jre

码农研究僧的博客 6万+

故障诊断 | 小波变换机械设备外圈振动信号故障诊断

故障诊断 | 小波变换机械设备外圈振动信号故障诊断

天天酷科研的博客 506

MVVM-Day4

implementation ('com.alibaba:arouter-api:1.5.2') //ARouter依赖 //版本要改成最新版本。annotationProcessor 'com.alibaba:arouter-compiler:1.5.2' //ARouter依赖。Home为第一页面、Friend为第二页面、Message为第三页面、Mine为第四页面。LoginActivity中跳转方法(同intent跳转)商品、关注、推荐页面。

LD_Round的博客 427

网络流量异常信息分析方法研究

本课题针对网络安全中网络流量异常的分析方法进行研究,提出一种基于机器学习和深度学习的异常检测算法。该算法采用卷积神经网络(CNN)和长短时记忆神经网络(LSTM)结合的方式,通过训练得到二分类模型,从而实现对网络流量异常的检测。随着互联网的飞速发展,网络攻击事件日益增多,网络安全问题成为了亟待解决的问题之一。常见的网络攻击手段包括 DDoS 攻击、SQL 注入、XSS 攻击等,这些攻击手段可能导致网络系统发生异常,给网络运维、数据安全带来极大的挑战。

肥晨开发的学习之路 1036

MVVM最佳实践

一、什么是MVVM MVP中随着业务逻辑的增加,UI的改变多的情况下,会有非常多的跟UI相关的情况,这样就会造成View的接口会很庞大。而MVVM就解决了这个问题,通过双向绑定的机制,实现数据和UI内容,只要想改其中一方,另一方都能够及时更新的一种设计理念,这样就省去了很多在View层中写很多case的情况,只需要改变数据就行。 MVVM 由下面三层组成: View:主要进行视图控件的一...

walk的博客 1408

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Day19_02_Vue教程之MVVM模式

MVVM模式 一.什么是 MVVM? MVVM(Model-View-ViewModel)是一种软件架构设计模式,由微软 WPF(用于替代 WinForm,以前就是用这个技术开发桌面应用程序的)和 Silverlight(类似于 Java Applet,简单点说就是在浏览器上运行的 WPF) 的架构师 Ken Cooper 和 Ted Peters 开发,是一种简化用户界面的事件驱动编程方式。...

一一哥 619

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Android MVVM框架搭建(二)OKHttp + Retrofit + RxJava

Android MVVM框架搭建(二)Retrofit + RxJava前言正文一、Retrofit使用二、RxJava使用 前言   在上一篇文章中,简单的介绍了MVVM框架的成员和简单使用,一个成熟的框架自然是离不开网络访问的,因此文本将通过Retrofit + RxJava去为MVVM框架增加一个网络请求模块。 正文   让我们开始吧!说实话搭建框架首先要做的是创建一个library,但是我并没有这么做,不是不去做,而是还不成熟。现在这个框架还不完整,还少了很多实际开发中需要的东西。因此一个成熟的框架

晨曦 1万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

MVVM-Day6(视频)

page>14,size=10视频部分可播放。

LD_Round的博客 468

初识Vue.js入门到放弃Day1(上)——MVVM模式的优点

Vue.js—Day1 文章目录Vue.js—Day11.1. MVVM1.1.1. M:Model1.1.2 V: View1.1.3 VM: ViewModel1.1.4 优点 (面试常问)1.2 VM原理手写一个事件发布/订阅模式 1.1. MVVM 架构方式、开发思想 Model 数据模型(操作数据的类) View 视图界面(HTML) ViewModel视图数据模型 (驱动视图改变的data数据) 1.1.1. M:Model 服务端处理数据库交互 mongoose 设计数据模型 m

Myself's 优快云 342

WPF-MVVM模式学习笔记3——MVVM概念再次挖掘

通过上篇文章WPF-MVVM模式学习笔记2——MVVM简单样例>

王文松的博客 3305

Vue Day01 理解MVVM

(这是第一个Vue 页面 很久没有接触代码了,一切从头开始) new Vue 创建一个Vue对象; el 制定绑定Dom(接管DOM 操作); data:初始化数据,页面可以直接访问; **v-model 重点 可以实现数据双向绑定,改变了这里的值,其他地方数据也跟着改变; {{xxxxx}}-------xxxxx显示数据`` <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"&g

zhou的博客 202

MVVM-Day9(直播)

调用适配器完成礼物页面;

LD_Round的博客 448

mvvm框架

Overrideinitdate();@Override});

buxiangzilv的博客 698

专高三day3登录注册

Toast.LENGTH_SHORT).show();Toast.makeText(RegisterActivity.this, "注册失败", Toast.LENGTH_SHORT).show();Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_SHORT).show();//将map集合转换为json。

2301_79998448的博客 974

SwiftUI学习笔记day3: Lecture 3 | Stanford CS193p 2023

Model(模型)负责处理业务逻辑和数据。提供数据给ViewModel,并接收ViewModel传来的业务操作请求。ViewModel(视图模型)位于Model与View之间,起到连接和协调作用。包含界面的状态、业务逻辑以及界面的交互处理。ViewModel负责从Model获取数据,并以更便于View使用的方式进行数据封装或转换。当数据发生变化时,ViewModel会通知View去更新界面。View(视图)只负责界面的展示,响应用户操作,将操作交由ViewModel处理。

本科在读,致力于Linux/C++方向的学习,同时涉及数据结构与算法,操作系统,数据库mysql等等 1012

深入浅出Vue【Day2】MVVM设计模式以及数据绑定常见的指令的用法总结

由于取值为false时v-if不会创建元素,所以如果需要切换元素的显示和隐藏,每次v-if都会创建和删除元素,由于取值为false时v-show会创建元素并设置display为none,所有如果需要切换元素的显示和隐藏,不会反复创建和删除,只是修改display的值,所以:如果企业开发中需要频繁切换元素显示隐藏,那么推荐使用v-show,否则使用v-if。v-show和v-if的能够一样都是条件渲染,取值为true就显示,取值为false就不显示。相当于JS中的for in循环,可以根据数据多次渲染元素。

零小唬的博客 297

【Vue学习笔记 Day01】Vue基本代码和MVVM之间的对应关系

Vue基本代码和MVVM之间的对应关系 1、导入vue的包 <script scr="lib/vue.js"> 2、创建一个Vue实例,当我们导入包之后,在浏览器内存中就多了一个Vue的构造函数 var vm = new Vue({}) 3、el:表示当前我们new的这个实例,要控制页面上的哪个区域 var vm = new Vue({ el:'#app', }) 4、data属性中,存放的是el中要使用到的数据 var vm = new Vue({ el:'#app',

共你山今的博客 262
上一篇: MVVM-Day2
下一篇: MVVM-Day4
LD_Round
博客等级 码龄4年 83粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值