Android开发之 DataBinding+LiveData+ViewModule

Android开发之DataBinding+LiveData+ViewModule

在这里插入图片描述

众所周知,Android海外主流开发已经开始使用Google最新提供的JetPack Compose进行开发。

Compose使用MVI框架,代表了应用开发从命令式编程向响应式编程的转变。(翻译原因,也叫做声明式编程)

转过头国内的开发人员发现,DataBinding+LiveData+ViewModule 这种搭配,居然还没成为主流。
在这里插入图片描述

海外已经开始用Kotlin协程 +JetPack Compose 进行开发了。
说句题外话,国内因为特殊原因,你懂得。不管是从Android 最新SDK版本的普及,还是开发方式都落后于国际项目。

这波趋势是无法避免的,就像当年Google推进AndroidStudio代替Eclipse一样。Kotlin在Androoid开发方向上一定会逐步占据主流。

特别是应用层开发,作为Android,IOS,H5,Flutter,VUE都开发过得我来说,由衷的体会到,应用层开发会越来越简洁。不管是响应式编程这个概念的崛起,还是逐步递增迭代的语法优化:空安全检查,Lambda表达式。各种好用的UI框架组件等等。

如果想在应用层开发上,走得远只有两条路了,唯有广度和深度两个方向而已。

要不然你就垂直开发能力很强,精通Android底层一直到应用层。要不然你就需要掌握多种开发语言,就是所谓的跨平台能力。

废话不多说了,今天的主题主要是和讲DataBinding+LiveData+ViewModule。 其实这玩意入门很简单。我先普及一下概念。

我会从是什么,干嘛用,怎么用。三个维度来讲。

DataBinding:
是什么?:
将布局中的界面组件 与 应用中的数据源 进行绑定

干嘛用?:
我们使用它之后,就不需要再使用某一个控件时去findviewbyid了。

    findViewById<TextView>(R.id.sample_text).apply {
        text = viewModel.userName
    }

换句话说,我们可以更简单的使用视图树上的控件节点。不用关心它的声明周期,只要能获取到,说明就是存在的。

只要启动了Databinding,AndroidStudio会根据xml元素自动在生成对应的布局类。是个全局对象,直接可以通过点点点的方法获取控件。
比如你的布局名字是activity_login.xml
那对应的全局对象就是ActivityLoginBinding。

这种写法可以很好的避免,空异常崩溃。之前我们操作数据刷新,如果控件为空,就APP就崩了。

怎么用?:
build.gradle 文件中将 dataBinding 构建选项设置为 true,如下所示:

android {
    ...
    buildFeatures {
        dataBinding true
    }
}

布局xml文件需要注意对Activity的对应绑定关系:

 private ActivityLoginBinding binding;
      binding = ActivityLoginBinding.inflate(getLayoutInflater());
              final EditText usernameEditText = binding.username;

LiveData + ViewModule 这一对儿是相辅相成的关系。他们是Android项目MVVM框架,VM实现的核心。

多说一句,这里的ViewModule 和 框架的ViewModule是两个东西。后者框架是概念,是整个数据绑定View,实现数据去驱动UI的核心层。 前者是封装的操作对象,你可以理解为工具类。

LiveData
是什么?
一种可观察的数据存储器类。 具有生命周期感知能力,可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。
它的核心实现就是个观察者模式。通过对数据进行注册观察,来更新数据变化给UI。而最妙的是,只有在前台这种活跃的生命周期下,它才会更新回调。

干嘛用?:
确保界面符合数据状态,不会发生内存泄漏,不会因 Activity 停止而导致崩溃,不再需要手动处理生命周期,数据始终保持最新状态。

怎么用?:
这玩意和viewModule是配对使用的。一个viewmodule相当于工具类。里面可以有多个livedata。

    private LoginViewModel loginViewModel;
       loginViewModel.getLoginFormState().observe(this, new Observer<LoginFormState>() {
            @Override
            public void onChanged(@Nullable LoginFormState loginFormState) {
             // do some sth
            }
        });

通过observe对数据进行观察者注册监听。在onChangged接收数据变化回调。真的方便的一批。

而loginViewModule是继承与viewMdoule,里面就是对数据进行livedata封装的操作,我们看下:

public class LoginViewModel extends ViewModel {

    private MutableLiveData<LoginResult> loginResult = new MutableLiveData<>();

    LiveData<LoginResult> getLoginResult() {
        return loginResult;
    }

    public void login(String username, String password) {
        // can be launched in a separate asynchronous job
        Result<LoggedInUser> result = loginRepository.login(username, password);

        if (result instanceof Result.Success) {
            LoggedInUser data = ((Result.Success<LoggedInUser>) result).getData();
            loginResult.setValue(new LoginResult(new LoggedInUserView(data.getDisplayName())));
        } else {
            loginResult.setValue(new LoginResult(R.string.login_failed));
        }
    }

我们看到MutableLiveData这个东西会一脸懵逼,但其实这是liveData的一个抽象子类。实际上就是livedata,从这个getLoginResult函数的回调对象我们就可以确认。

并且MutableLiveData实现在下面:

public class MutableLiveData<T> extends LiveData<T> {
    @Override
    public void postValue(T value) {
        super.postValue(value);
    }

    @Override
    public void setValue(T value) {
        super.setValue(value);
    }
}

我们可以看到主要是对包括的数据,暴露出了post和set两个函数。

setValue()只能在主线程中调用,postValue()可以在任何线程中调用。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 这三个组件在 Android 开发中经常一起使用。 Fragment 是一种 UI 组件,它可以被添加到 Activity 中,用于显示用户界面。LiveData 是一种持有数据的类,它可以感知数据的变化并将变化推送给注册的观察者。DataBinding 是一种将数据绑定到 UI 上的技术,它可以让你在布局文件中直接使用变量,而无需在代码中手动设置值。 使用 Fragment + LiveData + DataBinding 的一般步骤如下: 1. 创建一个 Fragment 类,并在其中定义 LiveData 对象; 2. 在 Fragment 的布局文件中使用 DataBinding,将 LiveData 对象绑定到 UI 控件上; 3. 在 Fragment 中注册 LiveData 的观察者,并在数据变化时更新 UI。 具体实现可以参考以下代码: ```kotlin class MyFragment : Fragment() { private val data = MutableLiveData<String>() override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { val binding = DataBindingUtil.inflate(inflater, R.layout.fragment_my, container, false) as FragmentMyBinding binding.lifecycleOwner = this binding.data = data return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) data.observe(viewLifecycleOwner, Observer { newValue -> // 更新 UI }) } } ``` 在这个例子中,我们创建了一个名为 `data` 的 LiveData 对象,并将其绑定到了布局文件中的一个 TextView 控件上。在 `onViewCreated` 方法中,我们注册了 `data` 的观察者,并在数据变化时更新了 UI。注意,我们在 `onCreateView` 方法中使用了 DataBinding,将 `data` 对象传递给了布局文件。这样,我们就可以直接在布局文件中使用 `data` 变量来显示数据了。 ### 回答2: Fragment(片段)是一种在Android中用于构建用户界面的组件。它可以作为Activity的一部分存在,在Activity内部承载和管理界面。Fragment具有自己的生命周期,可以接收用户交互事件,并有自己的布局文件和逻辑代码。Fragment可以实现模块化开发,将复杂的界面逻辑拆分成多个Fragment,提高代码的可维护性和复用性。 LiveData(生命周期感知的可观察数据对象)是一种设计用于在应用程序组件之间共享数据的类。LiveData具有生命周期感知能力,能够根据组件的生命周期自动触发数据变化通知。LiveData可以感知Activity、Fragment等组件的生命周期状态,并在活跃状态下向观察者发送数据更新,确保数据的及时更新和有效传递。LiveData还支持线程切换,可以使用主线程观察数据变化,避免在后台线程操作UI。 DataBinding(数据绑定)是一种使数据与界面进行自动绑定的技术。通过在布局文件中添加特定的标记和表达式,可以直接将界面上的控件与数据源进行绑定,避免了传统的findViewById和手动设置数据的过程。DataBinding能实现双向绑定,当数据源发生变化时,界面可以自动更新;用户输入变化时,数据源也能自动更新。使用DataBinding可以减少代码量,提高开发效率,同时还提供了一套简单易用的API,方便实现复杂的界面逻辑。 ### 回答3: Fragment、LiveDataDataBindingAndroid开发中常用的三个组件。 Fragment可以理解为Activity中的小片段,它具有自己的布局和生命周期,并且可以嵌入到Activity中。通常情况下,一个Activity可以包含多个Fragment,这样可以使得界面更加模块化、灵活性更高。通过使用Fragment,可以实现页面的动态替换,实现灵活的界面切换。 LiveData是一种具有生命周期感知能力的数据持有者,它可以感知Activity或Fragment的生命周期并自动进行数据的更新,从而能够确保数据和UI之间的同步。LiveData具有以下几个优点:一是能够减少内存泄漏的风险,因为它会自动根据生命周期进行数据的清理;二是能够确保数据的一致性,LiveData在数据发生变化时会自动通知观察者更新UI;三是能够避免不必要的UI更新,LiveData会判断是否有活跃的观察者,从而避免了不必要的数据更新。 DataBinding是一种用于实现数据驱动UI的技术,它能够将布局和数据进行绑定,使得数据的更新能够自动反映到UI上。通过使用DataBinding,可以大大简化UI更新的代码,提高开发效率。它有以下几个特点:一是能够自动生成大量的样板代码,减少手动编写findViewById和setText等操作;二是能够自动处理数据和UI的同步,当数据发生变化时,UI会自动更新;三是能够提高代码的可读性,因为数据的绑定操作是在布局文件中完成的,能够更加清晰地展示UI和数据之间的关系。 综上所述,Fragment、LiveDataDataBindingAndroid开发中非常重要的组件,它们分别负责页面的模块化、数据的同步更新和数据驱动UI,通过合理地使用它们可以提高开发效率、降低内存泄漏风险,从而提升用户体验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值