Android中jetpack讲解(详)--课外拓展知识讲解

说明:本篇文章是在一次课堂上,我为班级同学分享的一篇关于Android最新的jetpack的普及知识,内容广泛,仅仅是了解性的内容,如果需要深入了解,本篇文章可能不适合。

Butter Knife(黄刀油)

网站

介绍

用于Android视图的字段和方法绑定,它使用注释处理为您生成样板代码。

  • 消去代码中通过findviewById方法来找控件。
  • 可以简化事件点击的处理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ay4cICwF-1620637089301)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201125200310497.png)]

``

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() {
    }

用法

1.支持jdk1.8

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }

在这里插入图片描述

在这里插入图片描述

2.添加butterknife依赖

dependencies {
  implementation 'com.jakewharton:butterknife:10.2.3'
  annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3'
}

3.安装butterknife插件

在Android studio插件中安装Butter Knife

在这里插入图片描述

4.具体使用步骤

右边布局,找到Generate

在这里插入图片描述

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vskn9cLz-1620637089313)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201113150634106.png)]

注意:如果想要一键生成点击事件或者想要获取控件,一定要让各个控件有id才行,否则会出现下面错误。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SUjFihCs-1620637089313)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201123180251035.png)]

在这里插入图片描述

Jetpack

官网Jetpack介绍

Jetpack中的有些组件并不是第一次推出,其中LifeCycle、LiveData、ViewModel、Room等组件早在 Google I/O 2017年大会上就随着 Android Architecture Component(AAC)一起推出了,但是推广效果一般。时隔一年后谷歌在AAC的基础之上发布了Jetpack,并发布了其他工具以解决Android技术选型乱以及开发不规范等问题。

Jetpack的内容

img

定义

Jetpack 是一个由多个库组成的套件,可帮助开发者遵循最佳做法,减少样板代码并编写可在各种 Android 版本和设备中一致运行的代码,让开发者精力集中编写重要的代码。

为什么要用Jetpack

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1pEEE3GQ-1620637089315)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201123184614494.png)]

Jetpack包含的内容

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zvUqB1hV-1620637089318)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\e8fceada5e505aecdb8711bd5b0884d0.webp)]

  1. Data Binding:数据绑定库是一种支持库,借助该库,您可以使用声明性格式(而非程序化地)将布局中的界面组件绑定到应用中的数据源。(类似于Butter Knife)
    2. LiveData:同RxJava的作用一样,对数据进行监听,优点就是无需处理生命周期、无内存泄漏等。(使用到了观察者模式,监听数据的改变,数据一变,就会通过回调自动刷新相应UI)

MutableLiveData:这个数据类有着监听自身变化的能力,并且通过监听者模式告诉 其他组件数据更新。

3.ViewModel:当做MVVM的ViewModel层,并具有声明周期意识的处理和UI相关的数据。

它会在活动重建时仍然保存数据,在活动创建完成后从中获取数据

img

(简化了应用中目标之间导航的实现)

Jetpack中的Room数据库

详细教程

https://developer.android.google.cn/training/data-storage/room

Room包含的三大注解

  1. Database:包含数据库持有者,并作为与 App 持久关联数据的底层连接的主要访问点。

    用 @Database 注解的类应满足以下条件:

    是一个继承至 RoomDatabase 的抽象类。
    在注解中包含与数据库相关联的实体列表。
    包含一个具有 0 个参数的抽象方法,并返回用 @Dao 注解的类。
    在运行时,您可以通过调用 Room.databaseBuilder() 或 Room.inMemoryDatabaseBuilder() 获取 Database 实例。

  2. Entity:表示数据库的表

  3. Dao:包含用于访问数据库的方法。

Room数据库如何使用

引入依赖

//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"

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AZkJCxyV-1620637089319)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201113154240307.png)]

Room实现四步曲
  1. 编写Entity层
  2. 编写Dao层(访问数据库的接口)
  3. 编写Database层(类似于Manager)

4.编写MainActivity中访问数据库的具体实现

编写Entity
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 + '\'' +
                '}';
    }
}

编写Dao层

注: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);
}

Database

注意事项:

  • 使用Database需要注意指明entities(表),version版本(如果你在entity增加了属性,就需要改变版本),exportSchema默认为false
  • 使用Database时,需要让其为抽象类,同时Dao层方法也需要为抽象类
  • 其次,需要继承RoomDatabase
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 实例的查询)不受此规则约束,因为它们在需要时会在后台线程进行异步查询。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iQnBVAKJ-1620637089321)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201114203528292.png)]

/**
 * 获取数据库
 */
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相关组件,期待后面的精彩详细文章的产出

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

William_Tao(攻城狮)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值