Android Architecture Components应用架构组件实战

Android MVVM 架构应用实现(2) 外链图片转存中…(img-oBry7qPV-1713720227966)] 阅读详情

    Google IO 2017发布Android Architecture Components,这个新的架构库旨在帮助我们设计健壮、可测试的和可维护的应用程序。AAC主要提供了Lifecycle,LiveData,ViewModel ,Room等功能,在代码中使用它会使得App架构更加健壮,避免内存泄漏和一些空指针等问题。整体的架构如下:



        在使用这些组件前先需要在gradle中进行加入如下依赖:

implementation 'android.arch.lifecycle:extensions:1.1.0'
annotationProcessor "android.arch.lifecycle:compiler:1.1.0"
implementation 'android.arch.persistence.room:runtime:1.0.0'
annotationProcessor 'android.arch.persistence.room:compiler:1.0.0'

一、Lifecycle

         Lifecycle是一个生命周期管理类,用来对外界提供的一个接口,用来监控Activity或者Fragment的生命周期,使得生命周期从Activity或者Fragment中解耦出来。

        1、让需要管理生命周期的类实现LifecycleObserver接口,并且在对应的生命周期方法上加上注解,这个注解由Lifecycle提供,分别是:

  • @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)  对应 onCreate方法;
  • @OnLifecycleEvent(Lifecycle.Event.ON_START) 对应 onStart方法;
  • @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) 对应 onResume方法;
  • @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) 对应 onPause方法;
  • @OnLifecycleEvent(Lifecycle.Event.ON_STOP) 对应 onStop方法;
  • @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) 对应onDestroy 方法;
  • @OnLifecycleEvent(Lifecycle.Event.ON_ANY)  所以事件都执行。
public class ActivityLifeObserver implements LifecycleObserver {

    private static final String TAG = "ActivityLifeObserver";

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void onCreate() {
        Log.i(TAG, "onCreate()");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void onStart() {
        Log.i(TAG, "onStart()");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void onResume() {
        Log.i(TAG, "onResume()");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void onPause() {
        Log.i(TAG, "onPause()");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void onStop() {
        Log.i(TAG, "onStop()");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void onDestroy() {
        Log.i(TAG, "onDestroy()");
    }
}

        2、让Activity或者Fragment实现LifecycleOwner接口,注册监听,并且在onDestory方法中注销监听。

public class MainActivity extends AppCompatActivity implements LifecycleOwner {

    private LifecycleRegistry mLifecycleRegistry;
    private ActivityLifeObserver mActivityLifeObserver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mLifecycleRegistry = new LifecycleRegistry(this);
        // 注册需要监听的 Observer
        mActivityLifeObserver = new ActivityLifeObserver();
        mLifecycleRegistry.addObserver(mActivityLifeObserver);
    }

    @Override
    public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        mLifecycleRegistry.removeObserver(mActivityLifeObserver);
    }
}

        打印结果如下:


二、LiveData

         用于数据的处理传递,它能够保存数据和Activity或者Fragment的生命周期同步,通常中一般使用他的实现类MutableLiveData,创建MutableLiveData需要提供一个泛型,常用的方法:

  • setValue:用于设置数据,在主线程执行。
  • postValue:用于设置数据,在子线程执行。
  • getValue:用于获取数据。
  • observe:观测LiveData设置的数据变化,基于观察者设计模式,和生命周期进行绑定。        
public MutableLiveData<ProductBean> mLiveData = new MutableLiveData<>();

public void setProduct(ProductBean bean) {
    mLiveData.setValue(bean);
}

public ProductBean getProduct() {
    return mLiveData.getValue();
}

        observe方法的源码如下:

@MainThread
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) {
    if (owner.getLifecycle().getCurrentState() == DESTROYED) {
        // ignore
        return;
    }
    LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
    ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
    if (existing != null && !existing.isAttachedTo(owner)) {
        throw new IllegalArgumentException("Cannot add the same observer"
                + " with different lifecycles");
    }
    if (existing != null) {
        return;
    }
    owner.getLifecycle().addObserver(wrapper);
}

        可以看出observe方法添加了一个注解,表明工作在主线程,然后判断当前Activity或者Fragment是否被销毁,如果onDestory,则不会执行添加观察者。否则的话,将当前的Activity或者Fragment和observe包装成LifecycleBoundObserver ,然后再通过addObserver添加观察者,和生命周期进行一个关联。

        在设置数据的时候仅需要调用setProduct方传进bean对象,获取数据的时候可以使用getProduct进行获取,在需要更新UI的地方调用observe方法进行更新,在这块可能看不出来LiveData的优势,一般情况下LiveData适合ViewModle相结合进行使用,ViewModle请看下面。

三、ViewModle

        ViewModel用来存储和管理UI相关的数据,可于将一个Activity或Fragment组件相关的数据逻辑抽象出来,并能适配组件的生命周期,可用于在Activity或Fragment间共享数据,它可以使 ViewModel 以及 ViewModel 中的数据在屏幕旋转或配置更改引起的 Activity 重建时存活下来, 重建后数据可继续使用。

1、ViewModle的创建

        ViewModle的创建继承自AndroidViewModel或者ViewModle,区别在于AndroidViewModel是ViewModle的子类,提供了getApplication的方法。

public class MyViewModle extends AndroidViewModel {
    public MutableLiveData<ProductBean> mLiveData = new MutableLiveData<>();
    public MutableLiveData<Throwable> mLiveDataThrowable = new MutableLiveData<>();
    public MutableLiveData<String> mLiveDataString = new MutableLiveData<>();

    public void setProduct(ProductBean bean) {
        mLiveData.setValue(bean);
    }

    public ProductBean getProduct() {
        return mLiveData.getValue();
    }

    public void setError(Throwable e) {
        mLiveDataThrowable.setValue(e);
    }

    public void setComplete(String complete) {
        mLiveDataString.setValue(complete);
    }
}

2、数据的设置

        数据的设置配合LiveData的方法在需要的地方进行设置。首先需要获取ViewModle类,ViewModle类的获取不是通过new关键字创建,而是通过ViewModelProvider提供的:

MyViewModle = ViewModelProviders.of((FragmentActivity) activity).get(MyViewModle.class);

        从而通过ViewModle实例对象可以调用创建的相关方法,进行数据设置。代码案例如下:

getInatance().create(ProductInterface.class).subscribeOn(Schedulers.newThread())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Observer<ProductBean>() {

            @Override
            public void onNext(ProductBean productBean) {
                viewModle.setProduct(productBean);
            }

            @Override
            public void onCompleted() {
                viewModle.setComplete("请求完毕");
            }

            @Override
            public void onError(Throwable e) {
                viewModle.setError(e);
            }
        });

3、更新UI

        使用ViewModle更新UI会主动的监控Data的变化,当Data变化的时候会通知到observe,并且和生命周期绑定,不用担心当Activity或者Fragment被销毁的时候获取不到对象或者持有引用导致的空指针和内存泄漏,这一点非常的好。更新UI同样也需要获取ViewModle类,需要ViewModle类中的LiveData提供的observe方法,需要两个参数,一个是当前上下文对象,另一个是一个Observer,如下:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MyViewModle viewModle = ViewModelProviders.of(this).get(MyViewModle.class);
        viewModle.mLiveData.observe(this, mObserverProductBean);
        viewModle.mLiveDataString.observe(this, mObserverString);
        viewModle.mLiveDataThrowable.observe(this, mObserverThrowable);

    }

    /**
     * 加载数据成功
     */
    Observer mObserverProductBean = new Observer<ProductBean>() {
        @Override
        public void onChanged(@Nullable ProductBean parse) {
            List<ProductBean> list = parse.getList();
        }
    };
    /**
     * 加载数据完成
     */
    Observer mObserverString = new Observer<String>() {
        @Override
        public void onChanged(@Nullable String s) {
            Log.e("TAG", s);
        }
    };
    /**
     * 加载数据错误
     */
    Observer mObserverThrowable = new Observer<Throwable>() {
        @Override
        public void onChanged(@Nullable Throwable throwable) {
            Log.e("TAG", throwable.getMessage());
        }
    };
}

        至此,Lifecycle,LiveData,ViewModel 就介绍完毕,还剩下一个Room数据库,他可以和Lifecycle,LiveData,ViewModel三者进行搭配使用,也相当方便,但是可供Android选中的第三方的数据库太多LitePal、GreenDao、DBFlow、realm等等,目前项目中也没有更改数据库的计划,因此也没有深究,在此不做介绍了。



Android Architecture Components组件详解 Android Architecture Components包括以下几个核心组件:LiveData、ViewModel、Room、Lifecycle、Navigation等。这些组件相互协作,为Android应用开发提供了统一的架构模式。本文详细介绍了Android Architecture Components组件的各个方面,包括组件概述、优势、使用场景和最佳实践。通过使用这些组件,开发者可以构建出可维护、可测试、高性能的Android应用。 阅读详情

相关推荐

Android Architecture Components:现代架构实践

本文详细阐述了Android Architecture Components在现代架构实践中的应用。通过代码解耦、异步处理、组件详解和使用场景等方面,我们了解到AAC为Android应用开发带来的优势。在开发过程中,正确使用AAC可以大大提高应用的质量和可维护性。为了实现现代架构实践,开发者应当掌握AAC的使用方法,并在实际项目中灵活运用。在未来,我们期待AAC能够继续发展,为Android开发提供更多便利。

2501_92488041的博客 1770

Android—Jetpack教程(五)

前言 在上一篇中,对Jetpack里面的Room进行了初步的使用,但每次操作数据后需要额外查询一次。在本篇中,将会对Room以及前面所学的进行一个整合。 话不多说,直接开始! 1、Room+ViewModel+LiveData 如图所示 这是官方推荐我们使用的架构, ViewModel和Repository交互 Repository与对应的数据库、网络请求交互 在上一篇的基础上,对应Room数据库相关的暂且不动。 因为数据库和Repository相互关联,而Repository又与ViewModel相

qq_30382601的博客 1394

Android Architecture Components实战

Android Architecture Components主要包括LiveData、ViewModel、Room、Lifecycle等组件。这些组件的引入,旨在解决Android应用开发中常见的问题,如内存泄漏、数据持久化、UI与数据逻辑分离等。通过实战经验,我们可以发现这些组件在实际开发中的优势和必要性。本文从数据持久化、UI与数据逻辑分离、性能优化等方面详细阐述了Android Architecture Components实战。

2501_92487875的博客 959

Android T-MVVM深度解耦开发框架

热文导读 | 点击标题阅读金九银十跳槽季如何进阶找到合适满意的工作?关于Java锁机制面试官会怎么问,深刻易懂【中秋福利文末Kotlin书籍免费送】程序员30 岁之后:如...

Java和Android架构 741

Android Architecture Components组件库解析

Android Architecture Components组件库为Android应用开发提供了强大的支持,它通过生命周期管理、数据持久化、代码质量提升和开发效率提高等方面,帮助开发者构建更高质量的应用。在未来的Android开发中,AAC将发挥越来越重要的作用。为了更好地利用AAC,开发者需要深入理解其组件的工作原理,并在项目中合理使用。同时,随着Android技术的发展,AAC组件库也将不断更新和完善,为开发者提供更多实用的功能。

2501_92487957的博客 545

Android Architecture Components 只看这一篇就够了

Lifecycle 组件指的是 android.arch.lifecycle 包下提供的各种类与接口,可以让开发者构建能感知其他组件(主要指Activity 、Fragment)生命周期(lifecycle-aware)的类。LiveData 是一种持有可被观察数据的类(an observable data holder class)。

2401_84148981的博客 690

Android Architecture Components

一、简介 Android Architecture Components 是谷歌在Google I/O 2017发布一套帮助开发者解决Android 架构设计的方案。使用Google 提供的处理数据持久化和管理组件生命周期的类,有助于应用开发者们构建更加鲁棒性,可测的,稳定可靠的应用。 二、Lifecycle Lifecycle 组件指的是 android.arch.lifecycle 包下...

walk的博客 361

android-architecture-components, Android架构组件示例.zip

android-architecture-components, Android架构组件示例 Android架构组件示例使用架构组件的示例的Collection:聊天室生命周期识别组件ViewModelsLiveData分页( 预览)WorkManager ( alpha )示例BasicSample 显示

wkt android,GitHub - kzwkt/android-architecture-components

Android Architecture Components samplesA collection of samples using the Architecture Components:RoomLifecycle-aware componentsViewModelsLiveDataSamplesThe Architecture Components and these samples ar...

weixin_35919125的博客 185

Android项目组件化示例代码(architecture components)

Android项目组件化示例代码(architecture components)

Android-基于AndroidArchitectureComponents架构搭建的基本项目

基于Android Architecture Components架构搭建的基本项目

AAC(Android Architecture Components)

1.初识 最近项目内有用到这个,故特地来学学,并且记录下来。有错误请直接指出,感谢。 AAC是啥 它是在Google 2017 I/O大会 提出来的一个概念,即Android Architecture Components(简称AAC),它是一套新的架构组件,使App的架构更加健壮。 图示 它的构成(本图来自:http://www.cnblogs.com/zqlxtt/p/688...

点滴积累 1万+

告别繁琐同步:Zotero与Obsidian双向联动新方案(基于Better BibTeX与MarkDBConnect)

本文详细介绍了一套基于Better BibTeX、Bibnotes Formatter和MarkDBConnect插件的Zotero与Obsidian双向联动方案。该方案通过建立智能数据通道,实现文献信息的自动同步与笔记的增量更新,解决了手动同步的繁琐问题,并支持在两大工具间无缝跳转,极大提升了科研和知识管理的工作效率。

weixin_29213827的博客 640

浅谈Android Architecture Components

浅谈Android Architecture Components浅谈Android Architecture Components 简介 Android Architecture Components Gradle 集成 LifeCycles LiveData Transformations ViewModel Room Entities Entity的参数 primaryKeys Entity的

流水不腐小夏 1万+

MaxScript批量修改材质、贴图名称

MaxScript批量修改材质、贴图名称1 实现效果1.1 修改前材质、贴图名称1.2 修改后2 代码 1 实现效果 1.1 修改前材质、贴图名称 1.2 修改后 2 代码 prefixName = "prefiname" maxFile = "maxfilepath" makeDir "newBitmappath" mapsPath = newbitmappath + "\\" fn formatStr index = ( str = index as string newS

郑德帅 3240

20.Labview使用子vi进行VI间的数据传递详解(模块化)

子VI(模块化)题主在题注中也提到, 子VI的建立只是为了减少程序的负担,那么我们当使用子VI的时候首先就要明确什么是子VI?什么样的程序可以作为子VI?首先我们来看NI官方给的定义,具体说明如下图所示:题主已经将重点画出来了,在官方的解释中将子VI定义为了模块化,大家可以看到创建模块化子VI的特点在于减少代码重复工作优化了程序的框架结构。把一个代码打包,需要的时候就拎出来让他处理处理,不需要的时候就让它躺在我的列表里就行了也不占用运行空间。那么创建子VI需要需要注意以下几点:①任何一个程序。

关注我,更多技术问题欢迎私聊~ 3514

Android Architecture Components 深入解析

在 Android 开发早期,应用状态管理和数据持久化一直是开发者面临的挑战。随着应用复杂度的增加,开发者通常会遇到以下问题: - Activity 和 Fragment 频繁重建导致数据丢失。 - 代码耦合度高,难以维护和测试。 - 数据同步和生命周期管理困难。 为了提升开发效率和代码质量,Google 在 2017 年推出了 **Android Architecture Components (AAC)**,帮助开发者更高效地构建高质量应用。

jiet_h的博客 1232

将GroundDINO、EdgeMTAM和FoundationPose的ONNX模型转换为TensorRT格式并部署到NVIDIA Jetson Orin平台的完整技术指南

TensorRT模型部署指南:从ONNX到Jetson Orin的优化实践 本文详细介绍了将GroundDINO、EdgeMTAM和FoundationPose模型从ONNX格式转换为TensorRT引擎并在Jetson Orin平台部署的全流程。主要内容包括: 环境配置:JetPack 5.1.2+环境搭建,TensorRT工具链安装,存储与交换空间优化 模型转换:动态尺寸处理、自定义算子实现、层融合策略及INT8量化校准 部署优化:引擎序列化加密、多模型并行推理架构设计、CUDA流异步执行 实战技巧。

huanghm88的专栏 437

Android Jetpack组件系列之Architecture Components

Android Jetpack组件系列之Architecture Components Architecture Components是什么? 学习一个新技术的最好的方式就是从官方文档开始,Architecture Components在Google的官方文档中是这样介绍的: Android architecture components are a collection of librarie...

JokerMk的博客 492

YOLOv8车辆碰撞识别检测系统(项目源码+YOLO数据集+模型权重+UI界面+python+深度学习+环境配置+目标检测)

随着我国汽车保有量的持续攀升,道路交通事故数量居高不下,车辆碰撞损伤的快速、精准评估已成为交通安全管理、保险理赔定损以及汽车后市场服务中的关键环节。传统的人工目视查验方法高度依赖评估人员的专业经验,不仅主观性强、效率低下,而且在复杂光照、多角度遮挡等真实场景下难以保证评估的一致性和可复现性。计算机视觉与深度学习技术的迅猛发展,为目标检测任务提供了强有力的技术支撑,使得基于视觉的车辆损伤自动化识别成为可能。

斌擎科技 128

手把手教你学Simulink--FIR滤波器的设计与优化仿真

FIR滤波器的设计目标通常包括指定的频率响应特性(如低通、高通、带通或带阻),以及特定的应用需求(如线性相位、最小化误差等)。Simulink提供了一个直观且强大的平台来模拟这些设计,并允许用户通过调整参数实时观察其对系统性能的影响。明确你的系统需求,比如输入信号类型(如正弦波组合)、采样率、FIR滤波器的设计参数(如滤波器类型、阶数、截止频率等)。假设我们需要设计一个低通FIR滤波器,用来去除高于1kHz的所有频率成分,保留低于1kHz的信号成分。采样率为8kHz。

MHD0815的博客 343
上一篇: Dagger2入门
下一篇: Android模块化与ARouter框架
一杯清泉
博客等级 码龄11年 314粉丝 210原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值