首页 > 其他分享 >Jetpack架构组件_LiveData组件

Jetpack架构组件_LiveData组件

时间:2024-10-22 19:46:31浏览次数:3  
标签:String androidx Jetpack void LiveData activityMainBinding 组件 import public

1.LiveData初识

LiveData:ViewModel管理要展示的数据(VM层类似于原MVP中的P层),处理业务逻辑,比如调用服务器的登陆接口业务。通过LiveData观察者模式,只要数据的值发生了改变,就会自动通知VIEW层,View层会设置观察者来监听数据的改变。

MVP:P调用M层去获取数据,P回调View层实现的接口,把数据以函数参数的形式传递过去。

2.示例工程

        build.gradle要修改下,增加如下配置以开启Databinding:

    dataBinding{
        enabled = true;
    }

 2.1View层

        布局界面,Alt+Enter可以转成Databinding可以识别的布局。这时识别前的布局。

 activity_main.xml。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:gravity="center_horizontal"
    android:orientation="vertical">

    <EditText
        android:layout_marginTop="100dp"
        android:id="@+id/edtUserName"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:hint="请输入用户名!" />

    <EditText

        android:id="@+id/edtPassword"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:hint="请输入密码!" />

    <Button
        android:id="@+id/btLogin"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:text="登陆"/>

</LinearLayout>

        转换后的布局:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

    </data>

    <LinearLayout
        android:id="@+id/main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity"
        android:gravity="center_horizontal"
        android:orientation="vertical">

        <EditText
            android:layout_marginTop="100dp"
            android:id="@+id/edtUserName"
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:hint="请输入用户名!" />

        <EditText

            android:id="@+id/edtPassword"
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:hint="请输入密码!" />

        <Button
            android:id="@+id/btLogin"
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:text="登陆" />

    </LinearLayout>
</layout>

         MainActivity.java

package com.gaoting.livedatatest.ui;

import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;

import com.gaoting.livedatatest.R;
import com.gaoting.livedatatest.databinding.ActivityMainBinding;
import com.gaoting.livedatatest.viewmodel.LoginViewModel;

/***
 * View层
 */
public class MainActivity extends AppCompatActivity {
    ActivityMainBinding activityMainBinding;
    LoginViewModel loginViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        activityMainBinding = DataBindingUtil.setContentView(this,R.layout.activity_main);
        loginViewModel = new ViewModelProvider(MainActivity.this).get(LoginViewModel.class);
        initView();
        initListener();
        initLiveDataObserver();
    }

    private void initLiveDataObserver() {
        loginViewModel.getStrToken().observe(this, new Observer<String>() {
            @Override
            public void onChanged(String newToken) {
                Toast.makeText(MainActivity.this,"TOKEN="+newToken,Toast.LENGTH_SHORT).show();
            }
        });
    }

    private void initListener() {
        activityMainBinding.btLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String username = activityMainBinding.edtUserName.getText().toString();
                String password = activityMainBinding.edtPassword.getText().toString();
                loginViewModel.login(username,password);
            }
        });
    }

    private void initView() {
        activityMainBinding.edtUserName.setText("test");
        activityMainBinding.edtPassword.setText("12345678");
    }
}

2.2ViewModel层:

package com.gaoting.livedatatest.viewmodel;

import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

import com.gaoting.livedatatest.model.HttpDataSource;

/***
 * VM层:
 * 1.viewModel用来管理view层(Activity要展示的数据):
 * 2.处理业务逻辑,比如对数据进行加工处理,获取HTTP接口数据。
 */
public class LoginViewModel extends ViewModel {

    //livedata token string
    MutableLiveData<String> strToken = new MutableLiveData<>();
    public MutableLiveData<String> getStrToken() {
        return strToken;
    }


    //login
    public void login(String username, String password) {
        //可能会对密码进行加密等业务逻辑,这里我们忽略。
        HttpDataSource  httpDataSource  = new HttpDataSource();
        String token = httpDataSource.login(username,password);
        strToken.postValue(token);
    }
}

2.3Model层:

package com.gaoting.livedatatest.model;

/***
 * 获取网络数据M层
 */
public class HttpDataSource {

    //模拟请求网络服务器的登陆业务接口
    public String login(String username, String password) {
        String token;
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        token = "123token";
        return token;

    }
}

标签:String,androidx,Jetpack,void,LiveData,activityMainBinding,组件,import,public
From: https://blog.csdn.net/huaqianzkh/article/details/143142623

相关文章

  • vue3 使用swiper轮播组件
    1.本地环境信息参考node版本:nodejs:v18.20.4npm:10.7.0vue版本"dependencies":{"vue":"^3.2.13",...}2.安装swiper依赖执行命令:npmiswiper安装后,查看工程中的package.json文件,新增了swiper依赖(默认最新版):"dependencies":{......
  • Windows Installer核心clbcatq.dll丢失?找回Windows Installer关键组件clbcatq.dll的修
    在Windows操作系统中,clbcatq.dll是WindowsInstaller服务的一个关键组件,它负责处理与安装、配置和删除WindowsInstaller包(.msi文件)相关的任务。如果clbcatq.dll文件丢失或损坏,可能会导致WindowsInstaller无法正常工作,进而影响软件的安装、更新和卸载。如果你遇到了clbcatq.dl......
  • 组件封装-双el-select联动搜索-实现方案&经验分享
    前情提要:    最近业务中需要实现产品与设备的联动搜索功能,需要两个el-select框,并且每个Select框是支持筛选的,毕竟设备和产品数量较多。这个功能在之前迭代的模块中实现过,但是并没有封装成为组件,现在要开发一个新的业务,其中”产品+设备“的联动搜索效果应用场景还有很......
  • 3D渲染所需的关键组件和技能,及云渲染技术帮助!
    3D渲染的世界中,一个明确定义的过程对于实现令人惊叹的成果至关重要。本节探讨了影响渲染工作流程的关键组成部分,从高分辨率输出所需的时间投入到掌握行业标准软件所需的多样化技能集,为成功项目奠定了基础。一、3D渲染的所需关键工作1、时间投入和工作流程效率实现高质量的渲染......
  • 《花100块做个摸鱼小网站! 》第八篇—增加词云组件和搜索组件
    ⭐️基础链接导航⭐️服务器→☁️阿里云活动地址看样例→......
  • 使用Radzen Blazor组件库开发的基于ABP框架炫酷UI主题
    一、项目简介使用过ABP框架的童鞋应该知道它也自带了一款免费的BlazorUI主题,它的页面是长这样的:个人感觉不太美观,于是网上搜了很多Blazor开源组件库,发现有一款样式非常不错的组件库,名叫:Radzen,它的组件库案例网址是:SampleBlazorDashboard|FreeUIComponentsbyRadzen,比较......
  • 原生小程序开发拓展能力组件|拓展组件库汇总(五)
    DialogDialog弹窗组件。开发建议客户端有提供会话框的api调用方式,如无特别业务定制需求,推荐优先使用ty.showModal属性列表属性类型默认值必填说明ext-classstring否添加在组件内部结构的class,可用于修改组件内部的样式titlestring否弹窗的标题buttonsarray[]否......
  • vue2组件
    模块和组件的区别1、模块化从代码逻辑的角度划分;方便代码分层开发,保证每个功能模块的职能单一2、组件化从UI界面的角度划分;前端的组件化,方便UI组件的重用父子组件传参1、父传子1、在父组件的子标签中自定义一个属性2、在子组件中使用props接收参数2、子传父1、在......
  • WPF - 集成HandyControl UI组件库
    WPF-集成HandyControlUI组件库 环境:net6+wpf+ HandyControl  一.创建项目   二.安装  NuGet包dotnetaddpackageHandyControl  三. 引入HandyControl资源字典 在你的WPF项目中的 App.xaml 或主题文件中1.引入HandyControl资源字典......
  • HarmonyOS:AbilityStage组件容器介绍
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(MaoistLearning)➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/......