说明:本篇文章是在一次课堂上,我为班级同学分享的一篇关于Android最新的jetpack的普及知识,内容广泛,仅仅是了解性的内容,如果需要深入了解,本篇文章可能不适合。
网站
用于Android视图的字段和方法绑定,它使用注释处理为您生成样板代码。
``
TextView textView = findViewById(R.id.textView);
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
``
@BindView(R.id.button)
Button button;
@BindView(R.id.normaltext)
TextView normaltext;
@OnClick(R.id.button)
public void onViewClicked() {
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
dependencies {
implementation 'com.jakewharton:butterknife:10.2.3'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3'
}
在Android studio插件中安装Butter Knife
右边布局,找到Generate
注意:如果想要一键生成点击事件或者想要获取控件,一定要让各个控件有id才行,否则会出现下面错误。
官网Jetpack介绍
Jetpack中的有些组件并不是第一次推出,其中LifeCycle、LiveData、ViewModel、Room等组件早在 Google I/O 2017年大会上就随着 Android Architecture Component(AAC)一起推出了,但是推广效果一般。时隔一年后谷歌在AAC的基础之上发布了Jetpack,并发布了其他工具以解决Android技术选型乱以及开发不规范等问题。
Jetpack 是一个由多个库组成的套件,可帮助开发者遵循最佳做法,减少样板代码并编写可在各种 Android 版本和设备中一致运行的代码,让开发者精力集中编写重要的代码。
MutableLiveData:这个数据类有着监听自身变化的能力,并且通过监听者模式告诉 其他组件数据更新。
3.ViewModel:当做MVVM的ViewModel层,并具有声明周期意识的处理和UI相关的数据。
它会在活动重建时仍然保存数据,在活动创建完成后从中获取数据
(简化了应用中目标之间导航的实现)
https://developer.android.google.cn/training/data-storage/room
Database:包含数据库持有者,并作为与 App 持久关联数据的底层连接的主要访问点。
用 @Database 注解的类应满足以下条件:
是一个继承至 RoomDatabase 的抽象类。
在注解中包含与数据库相关联的实体列表。
包含一个具有 0 个参数的抽象方法,并返回用 @Dao 注解的类。
在运行时,您可以通过调用 Room.databaseBuilder() 或 Room.inMemoryDatabaseBuilder() 获取 Database 实例。
Entity:表示数据库的表
Dao:包含用于访问数据库的方法。
//Room
def room_version = “2.2.5”
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
// optional - RxJava support for Room
implementation "androidx.room:room-rxjava2:$room_version"
// optional - Guava support for Room, including Optional and ListenableFuture
implementation "androidx.room:room-guava:$room_version"
// optional - Test helpers
testImplementation "androidx.room:room-testing:$room_version"
4.编写MainActivity中访问数据库的具体实现
package com.example.androidroom;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
@Entity
public class Goods {
//主键,默认自增
@PrimaryKey(autoGenerate =true)
int id;
//修改列名
// @ColumnInfo(name = "first_name")
double price;
String content;
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Goods(int id, double price, String content,String name) {
this.id = id;
this.price = price;
this.content = content;
this.name = name;
}
@Override
public String toString() {
return "Goods{" +
"id=" + id +
", price=" + price +
", content='" + content + '\'' +
", name='" + name + '\'' +
'}';
}
}
注:Goods …goods中的三个点代表可以传入多个参数
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;
import androidx.room.Update;
import java.util.List;
@Dao
public interface GoodsDao {
//查询所有商品
@Query("SELECT * FROM Goods")
List<Goods> getAllGoods();
//删除
// @Delete
@Query("delete from goods")
void deleteGoods();
//修改
@Update
void updateGoods(Goods ...goods);
//增加
@Insert
void insertGoods(Goods ...goods);
}
注意事项:
import androidx.room.RoomDatabase;
@Database(entities = Goods.class,version = 1,exportSchema = false)
public abstract class GoodsDateBase extends RoomDatabase {
public abstract GoodsDao getGoodsDao();
}
####MainActivity获取数据库层
注意:
allowMainThreadQueries()这个必须有,如果无的话,会报线程异常, Room 不支持在主线程上进行数据库访问,因为它可能会长时间锁定 UI。不过异步查询(返回 LiveData 或 Flowable 实例的查询)不受此规则约束,因为它们在需要时会在后台线程进行异步查询。
/**
* 获取数据库
*/
private void getData() {
goodsDateBase= Room.databaseBuilder(RoomActivity.this,GoodsDateBase.class,"Good_database").allowMainThreadQueries().build();
goodsDao=goodsDateBase.getGoodsDao();
}
时间锁定 UI。不过异步查询(返回 LiveData 或 Flowable 实例的查询)不受此规则约束,因为它们在需要时会在后台线程进行异步查询。
/**
* 获取数据库
*/
private void getData() {
goodsDateBase= Room.databaseBuilder(RoomActivity.this,GoodsDateBase.class,"Good_database").allowMainThreadQueries().build();
goodsDao=goodsDateBase.getGoodsDao();
}
后续我会在明年的暑假进行进一步详细的去学习jetpack相关组件,期待后面的精彩详细文章的产出