Jetpack架构组件_LiveData组件

1.LiveData初识

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

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

2.示例工程

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

Groovy 复制代码
    dataBinding{
        enabled = true;
    }

2.1View层

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

activity_main.xml。

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 复制代码
<?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

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层:

java 复制代码
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层:

java 复制代码
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;

    }
}
相关推荐
SHEN_ZIYUAN6 小时前
深度解析:从 AnimationHandler 原理看 Android 动画内存泄漏
android
冬奇Lab7 小时前
稳定性性能系列之十六——车机特定场景:黑卡死问题分析与排查实战
android·性能优化
座山雕~7 小时前
Springboot
android·spring boot·后端
墨香幽梦客8 小时前
API 集成的核心安全风险
架构·自动化
香气袭人知骤暖8 小时前
SQL慢查询常见优化步骤
android·数据库·sql
沛沛老爹9 小时前
Web开发者转型AI:Agent Skills版本控制与管理实战——从Git到AI技能仓库
java·前端·人工智能·git·架构·rag
丨康有为丨9 小时前
Android滑动冲突详解(场景+解决)
android
我命由我123459 小时前
充血模型与贫血模型
java·服务器·后端·学习·架构·java-ee·系统架构
凤希AI伴侣9 小时前
凤希AI提出FXPA2P:下一代点对点AI服务架构-2026年1月14日
人工智能·架构·凤希ai伴侣
忍冬行者9 小时前
Elasticsearch 超大日志流量集群搭建(网关 + 独立 Master + 独立 Data 纯生产架构,角色完全分离,百万级日志吞吐)
大数据·elasticsearch·云原生·架构·云计算