1 前言

大家都知道在Android开发中,一个好的Android架构能为项目带来极大的遍历,对于版本发布,后期维护等有着极为重要的地位,可以说架构是APP可持续发展的灵魂。在Android开发中也涌现出了很多优秀的架构,从早期的MVC到现在的MVP,MVVM等,Android架构一直在不停的演进。有鉴于此,google也终于在2017年的IO开发大会上推出了Android Architecture Components来帮助Android开发者构建更好的app架构。
当然详情可以参考下面这边文章
https://developer.android.com/topic/libraries/architecture/guide.html

2 Android Architecture Components简介

Android Architecture Components 主要包括以下几个组件:

Lifecycles
生命周期管理(Lifecycles)组件,帮助开发者创建 “可感知生命周期的” 组件,让其自己管理自己的生命周期,从而减少内存泄露和崩溃的可能性。生命周期库是其他架构组件(如 LiveData)的基础。
android.arch.lifecycle 包提供了类和接口允许你构建生命周期感知(lifecycle-aware)的组件——可以基于当前activity或fragment生命周期自动调节它们的行为的组件。
了解更多 Lifecycles 相关内容:
https://developer.android.google.cn/topic/libraries/architecture/lifecycle.html

LiveData
LiveData 是一款基于观察者模式的可感知生命周期的核心组件。LiveData 为界面代码 (Observer)的监视对象 (Observable),当 LiveData 所持有的数据改变时,它会通知相应的界面代码进行更新。同时,LiveData 持有界面代码 Lifecycle 的引用,这意味着它会在界面代码(LifecycleOwner)的生命周期处于 started 或 resumed 时作出相应更新,而在 LifecycleOwner 被销毁时停止更新。通过 LiveData,开发者可以方便地构建安全性更高、性能更好的高响应度用户界面。
了解更多 LiveData 相关内容:
https://developer.android.google.cn/topic/libraries/architecture/livedata.html

ViewModel
ViewModel 将视图的数据和逻辑从具有生命周期特性的实体(如 Activity 和 Fragment)中剥离开来。直到关联的 Activity 或 Fragment 完全销毁时,ViewModel 才会随之消失,也就是说,即使在旋转屏幕导致 Fragment 被重新创建等事件中,视图数据依旧会被保留。ViewModels 不仅消除了常见的生命周期问题,而且可以帮助构建更为模块化、更方便测试的用户界面。
了解更多 ViewModel 相关内容:
https://developer.android.google.cn/topic/libraries/architecture/viewmodel.html

Room
Room是一个基于SQLite对象映射层ORM的数据库框架,类似于greenDao等。 Room 可以和 LiveData 集成在一起,提供可观测数据库并感知生命周期的对象。Room 集简洁、强大和可靠性为一身,在管理本地储存上表现卓越。由于Room是官方推出的,还是有必要了解。
了解更多 Room 相关内容:
https://developer.android.google.cn/topic/libraries/architecture/room.html

以上只是简单的介绍Android架构组件的相关内容,我们先学会怎么使用,然后再深入的分析。

3 Android Architecture Components实战

想要阅读Android架构组件的Demo,可以参考官方推出一个示例工程
https://github.com/googlesamples/android-architecture-components 参考其BasicSample即可。
但是由于官方的Demo中使用了DataBinding,因此个人觉得Demo还是稍微有些冗余。可以来一个更简洁的Demo来演示各个组件的用法。

1 将android support组件升级到26.1.0版本以后,保证fragment activity等组件实现了Lifecycles等接口

2 build.gradle配置文件下添加以下依赖
由于google已经正式发布了Android Architecture Components 1.0版本,我们就可以添加以下依赖了

    compile "android.arch.lifecycle:runtime:1.0.0"    compile "android.arch.lifecycle:extensions:1.0.0"    annotationProcessor "android.arch.lifecycle:compiler:1.0.0"    compile "android.arch.persistence.room:runtime:1.0.0"    annotationProcessor "android.arch.persistence.room:compiler:1.0.0"    testCompile "android.arch.persistence.room:testing:1.0.0"

3 根据官方的Demo介绍,其代码结构和目录如下:

我们也仿照这个目录结构,新建的Demo工程最终目录如下:

下面我们分别来看UI下的代码:
ArchitectureActivity.java

/** * @author Created by qiyei2015 on 2018/1/13. * @version: 1.0 * @email: 1273482124@qq.com * @description: */public class ArchitectureActivity extends BaseActivity {    /**     * 标题栏     */    private CommonTitleBar mTitleBar = null;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        initData();        if (savedInstanceState == null) {            ProductListFragment fragment = new ProductListFragment();            getSupportFragmentManager().beginTransaction()                    .add(R.id.fragment, fragment, ProductListFragment.TAG).commit();        }        initView();    }    @Override    protected void initContentView() {        setContentView(R.layout.activity_architecture);    }    @Override    protected void initView() {        mTitleBar = new CommonTitleBar.Builder(this)                .setTitle("Android 架构组件")                .setRightText("维护中")                .build();    }    @Override    protected void initData() {    }    @Override    public void onClick(View v) {    }}

代码很简单,主要是UI部分的显示逻辑,显示标题栏和显示一个fragment即可。接下来看fragmeng 的逻辑

/** * @author Created by qiyei2015 on 2018/1/13. * @version: 1.0 * @email: 1273482124@qq.com * @description: */public class ProductListFragment extends Fragment {    public static final String TAG = "ProductListFragment";    private TextView mTextView;    private RecyclerView mRecyclerView;    private ProductListViewModel mViewModel;    ProductAdapter productAdapter;    @Override    public void onActivityCreated(@Nullable Bundle savedInstanceState) {        super.onActivityCreated(savedInstanceState);        mViewModel = ViewModelProviders.of(this).get(ProductListViewModel.class);        mViewModel.init("2");        mViewModel.getProducts("id").observe(this, new Observer>() {            @Override            public void onChanged(@Nullable List products) {                productAdapter.setDatas(products);                mTextView.setText("测试 :" + products.size());            }        });    }    @Nullable    @Override    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {        View rootView = inflater.inflate(R.layout.fragment_product_list,container,false);        mTextView = rootView.findViewById(R.id.tv1);        mRecyclerView = rootView.findViewById(R.id.recycler_view);        mTextView.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                mViewModel.setTest("2");            }        });        productAdapter = new ProductAdapter(getContext(),new ArrayList<>(),R.layout.recyclerview_item);        mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));        mRecyclerView.setAdapter(productAdapter);        productAdapter.setOnItemClickListener(new OnItemClickListener() {            @Override            public void click(View view, Product product,int position) {                ToastUtil.showShortToast(product.getName());            }        });        return rootView;    }}

fragment中持有ProductListViewModel的引用,同时会对ProductListViewModel做初始化,另外获取到了LiveData,使其注册了一个观察者,监听当LiveData中数据改变时通知UI层
接下来看ViewModel中代码。

/** * @author Created by qiyei2015 on 2018/1/13. * @version: 1.0 * @email: 1273482124@qq.com * @description: */public class ProductListViewModel extends ViewModel {    private String mId;    private ProductRepository mRepository;    public void init(String id){        mId = id;        mRepository = new ProductRepository(id);    }    public LiveData> getProducts(String id){        return mRepository.getProducts(id);    }    public void setTest(String id){        mRepository.setTest(id);    }}

很简单,持有ProductRepository 的引用,同时将数据的操作转发给ProductRepository 。

ProductRepository 中主要负责组织管理数据,这里我并没有增加网络获取数据或者从Room中获取数据的操作,个人觉得这一块的代码相对来说比较单一。

/** * @author Created by qiyei2015 on 2018/1/13. * @version: 1.0 * @email: 1273482124@qq.com * @description: */public class ProductRepository {    private MutableLiveData> mProducts;    List list = new ArrayList<>();    public ProductRepository(String id) {        mProducts = new MutableLiveData<>();    }    /**     * @return {@link #mProducts}     */    public MutableLiveData> getProducts(String id) {        for (int i = 0 ;i < 10;i++){            list.add(new Product("" + i,"name:" + i));        }        mProducts.setValue(list);        return mProducts;    }    public void setTest(String id){        list.add(new Product("" + id,"name:" + id));        mProducts.setValue(list);        ToastUtil.showLongToast("id");    }}

这样的一个Demo除了Room的使用没有增加到其中外,其他的都实现了。并且架构还是比较清晰。整个架构和官方的Demo的架构并无明显的区别。

源码参考:
github https://github.com/qiyei2015/EssayJoke appdemo中架构部分

4 Android Architecture Components 总结

总体来看,Android架构组件的使用较为简单,并且将架构做了分层,架构清晰,另外对于Activity,Fragment生命周期的管理也非常出色。但是官方给的Demo实在过去简单,将Android 架构组件用于大项目中还需要一定的实践经验。个人觉得这个架构组件特别适用于UI部分的解耦。对于Android纵向架构的梳理还是不错的,类似于MVP。如果再加上组件化,插件化的横向解耦,那么对于Android整个架构的影响还是比较不错的,值得开发者去学习和尝试。
下一期将会深入解读Android架构组件的设计以及关于这方面的思考。

更多相关文章

  1. Nginx系列教程(六)| 手把手教你搭建 LNMP 架构并部署天空网络电影
  2. Android云通信IM系列(1)-集成与配置
  3. android中布局 padding gravity margin的理解
  4. Android(安卓)study(1)--Intent
  5. BAT架构师花近十年时间整理的Android核心知识清单(Android岗)
  6. [置顶] Android(安卓)面试那些事之android基础
  7. Android(安卓)通过源码解析 Fragment 启动过程
  8. Android(安卓)HAL的作用及编程实例
  9. Android系统架构图及简单的系统架构

随机推荐

  1. 怎么在html,Javascript,vBscript中实现从
  2. Java多线程之Thread、Runnable、Callable
  3. BufferedImage到InputStream - 格式不同
  4. 20145122《 Java网络编程》实验五实验报
  5. java操作ftp实现文件的上传下载(适用于图
  6. ***100分,谁有用java mail做的把表单直接
  7. 急求用jersey2.x+spring3.x 开发rest web
  8. 从AWS Lambda发布到SNS时超时
  9. Finder3.0 - 集群支持即将发布
  10. Java中的TreeMap、Comparable、Comparato