今天学习android的数据库和协程
ROOM ROOM类似于JPA,能够定义DAO层使用预置的方法进行数据的操作。ROOM主要包含下面三个组件:
Database数据库类: 用于保存数据库并作为应用持久性数据底层连接的主要访问点。其实我感觉Database的类就是提供了Dao层的实例。
Entity实体类:用于表示应用的数据库中的表。
Dao类:提供您的应用可用于查询、更新、插入和删除数据库中的数据的方法。类似于Spring中的Dao层,定义了操作数据库的方法。
Entity 实体类就是我们常见的实体类,使用的注解也和JPA类似
@Entity(tableName = “users”):该注解说明该类是一个实体类,并且关联了users的表
@PrimaryKey:用于字段上,说明该字段是主键
@ColumnInfo(name = “last_name”):用于字段上,绑定实体类中的属性和表中的字段
1 2 3 4 5 6 @Entity(tableName = "users") data class User ( @PrimaryKey val id: Int, @ColumnInfo(name = "first_name") val firstName: String?, @ColumnInfo(name = "last_name") val lastName: String? ) Dao 在Dao类中定义方法来操作数据库。下面是一个简单样例:
...
技术学习 今日的技术学习内容为ViewModel和LiveData,这部分的内容相当于就是Android的架构学习,了解一个Android项目由哪些部分组成,如何去按照规范分层编写代码。
Android架构 MVVM(Model-View-ViewModel) Google 2015年I/O大会上推出了DataBinding的框架,使用了MVVM的模式,MVVM的思想就是从APP的业务逻辑中分离数据持久层。
Model: 实体类模型。Model提供了数据提取接口供ViewModel使用,经过数据转换和操作最终映射绑定到View层的某个UI元素的属性上。
View: 对应Activity和XML布局文件。不进行业务代码的编码,主要作用初始化控件,处理事件。简单地说:View层不做任何业务逻辑、不涉及操作数据、不处理数据,UI和数据严格的分开。
ViewModel: 负责完成View和Model之间的交互。ViewModel只做和业务逻辑和业务数据相关的事,不做任何和UI相关的事情,ViewModel 层不会持有任何控件的引用,更不会在ViewModel中通过UI控件的引用去做更新UI的事情。
https://tech.meituan.com/2016/11/11/android-mvvm.html
AAC(Android Architecture Components) Google 2017年I/O大会上发布了AAC,个人感觉就是在上述MVVM的基础上封装好了所有实现的组件,开发者仅需调用即可。其包含一下框架或者组件:
ROOM: 类似于JPA的持久层框架,用于数据的持久化解决方案。 WorkManager: 管理后台任务,类似于一个框架去管理后台的Service。 Lifecycle: 存储生命周期状态并且允许其它组件访问。 ViewModel: 上面MVVM架构中的ViewModel的实现,专注于业务的处理。 LiveData: 使用LiveData构建数据对象,在数据改变的时候,UI改变。 Navigation:导航,负责页面的跳转。 重点在于Room、ViewModel、LiveData、Navigation的使用,前面已经学习了Navigation,主要用于Fragment的跳转,可以定义不同的action,执行去执行该Action来进行不同Fragment的跳转。下面学习比较重要的ViewModel和LiveData。
LiveData 观察者模式 之前一直没有领悟到观察者模式的精髓,在Android中有很多地方都使用了观察者模式,比如,监听点击事件。对于观察者来说,它并不关心观察对象的数据是如何过来的,而只关心数据过来后进行怎样的处理。
LiveData格式 在写代码的时候根据固定的格式可以很轻松的写出LiveData的数据观察,ViewModel中定义LiveData,Fragment或者Activity中绑定ViewModel,然后监听LiveData的改变。
1 2 3 4 5 6 7 8 9 10 11 12 // viewModel中定义LiveData 以及LiveData改变的处理逻辑 // 下面这段代码就是定义了一个游戏结束的flag, private val _eventGameFinish = MutableLiveData<Boolean>() val eventGameFinish: LiveData<Boolean> get() = _eventGameFinish // 然后在fragment中监听LiveData的更新 根据LiveData中存储的flag进行不同的页面处理 viewModel.eventGameFinish.observe(viewLifecycleOwner, Observer { hasFinished -> if (hasFinished) { gameFinished() } }) 在其中有几个点需要明确一下:
...
Android学习的第三篇文章,跟着google的官方教程来到了lesson2,开始进行Layout的学习。
ViewGroups view的集合,构成了布局的结构。layout的构建使用有层级的View和ViewGroup对象。layout的结构如下:
LinearLayout 线性布局,UI元素被水平或者垂直摆放。
android:orientation: 布局方向,设置为水平或者垂直布局
horizontal: 水平,默认方向 vertical:垂直 android:layout_gravity: 子控件在父控件上的对齐方式
android:gravity: 控件内部的元素的对齐方式,支持多个方向,示例如下,下面的TextView中的text就在整个TextView的居中靠下的方向:
1 2 3 4 5 6 7 <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="bottom|center" android:text="TEST GRAVITY" android:textSize="50sp"/> android:layout_weight: 子控件在父控件中的权重,说白了就是占多大,比如说一个LinearLayout有5个button,每个button的weight都是1,那么其orientation方向上均分5分,每个button占1/5
其它的参数例如margin,padding等等和其它控件都是相同的,不赘述
RelativeLayout 相对布局,以相对位置显示子控件。说白了,就是可以指定子控件相对于其它控件的位置,比如说有两个buttonA和buttonB,如果想要buttonB布局在buttonA的右下方45度的未知,那么直接可以用两行就可以解决了,不需要嵌套多个LinearLayout。
1 2 android:layout_below="@+id/buttonA" android:layout_centerHorizontal="true" alignParentXx: 这个系列的参数都是相较于父控件而言的,相对于父控件停靠在哪个位置,Top, Bottom, left, right
...
今天先创建第一个app,跟的课程是google推荐的Developing Android Apps with Kotlin https://classroom.udacity.com/courses/ud9012
由于上面这个课程都是视频,所以也跟着google的kotlin android training get started补充理论知识
1. Explore Android Studio 上一篇文章已经讲过了gradle在项目中的结构,除了gradle外,其它的代码文件的分布也和java的项目类似,主要说一下其它文件夹。
res/layout android的布局文件夹,每一个Activity对应一个xml布局文件,在布局文件里面可以看到Activity的页面UI显示。
AndroidManifest.xml 一直以为是mainfest,结果是manifest(清单),列举了android系统运行app所需要的清单(Activity列表和权限)。
2. Anatomy(剖析) of Basic Android Project 下面就开始进行第一个app的开发,app叫dice roller(投色子),创建一个空项目后打开运行可以看到Hello World,就证明整个环境是通的。下面看代码。
MainActivity 首先看到的类是MainActivity,MainActivity就是Hello world这个页面的Activity。而页面的layout就是res/layout下的activity_main.xml,layout命名规则名称后置。对于Activity和layout中的xml的理解,和前端的html和js的关系类似,js处理交互逻辑,html显示页面UI,这里就是Activity处理交互逻辑,xml文件显示页面UI。
1 class MainActivity : AppCompatActivity() { ... 可以看到MainActicity继承自AppCompatActivity,AppCompatAcitvity是Activity的一个子类,兼容性和新特性都很好。
onCreate() 1 2 3 4 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } Activity不用构造器去初始化对象,而是用生命周期函数,onCreate()就是一个生命周期函数,它是Activity生命周期中的开始。
...
2021年10月份成为兼职Android开发,之前一直没正式系统学习,现在开一个series来记录Android的学习。
Gradle 开始学习android的时候,相信gradle是大家绕不开的一个地方,因为android的环境很难调通,很多依赖下载也是状况百出。但是即使这样,很多人也是选择解决问题后就不去深究背后的原理,选择直接绕过gradle直接写项目,遂在android学习的第一章先学习gradle。 题外话,最新版的springboot已经由maven改为使用gradle来进行构建项目。
什么是Gradle gradle本质上是个打包工具,结合了ant和maven的优点(没感觉出来)
https://www.zhihu.com/question/30432152
先把普通的gradle目录结构放出来,便于后面的理解。
1 2 3 4 5 6 7 8 9 root: gradle: wrapper: - gradle-wrapper.properties # 指定gradle版本号 - gradle-wrapper.jar # 安装部署gradle包 - build.gradle # 构建脚本 - settings.gradle # 指定工程名 - gradlew.bat # windows安装gradle命令 去执行jar包 - gradlew # linux安装gradle命令 去执行jar包 Gradle Wrapper(gradlew) 直到现在见到Gradle Wrapper(包装纸)也很迷惑,不知道这是什么,有什么作用。下面先从官方的解释开始看起:
...