• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Brick: 辅助android开发者搭建基于JetPack组件构建的MVVM框架,通过注解自动生成ViewM ...

原作者: [db:作者] 来自: 网络 收藏 邀请

开源软件名称:

Brick

开源软件地址:

https://gitee.com/numeron/brick

开源软件介绍:

Brick

当前最新版本号:

多模块示例android工程:https://github.com/xiazunyang/Wandroid.git

介绍

辅助android开发者搭建基于JetPack组件构建MVVM框架的注解处理框架。通过注解自动生成ViewModel的Factory类、lazy方法等;支持在项目的任意位置注入ROOM的dao层接口与Retrofit库中的api接口。

特点

android开发者可以将brick理解为一个轻量级的注入框架,使用非常简单,使用4-6个注解即可工作。brick主要在编译期工作, 不会在App运行时产生任何额外的性能消耗 ,并且只有1个注解库会打包到你的android工程中,不用担心体积增大的问题。

适用范围

  1. 使用androidx而非support库。
  2. 使用JetPackViewModel组件。
  3. 使用Retrofit作为网络请求库。
  4. 使用ROOM数据库框架。(可选)
  5. 服务端为多端口、多IP的项目。(可选)

引入

  1. 在你的android工程的根目录下的build.gradle文件中的适当的位置添加以下代码:
buildscript {    ...    repositories {        ...        maven { url 'https://jitpack.io' }    }    dependencies {        classpath 'com.gitee.numeron.brick:plugin:0.3.4'    }}allprojects {    repositories {        ...        maven { url 'https://jitpack.io' }    }}
  1. 在要启用brick的模块中找到build.gradle文件,在所有的apply下面添加一行:
apply plugin: 'com.android.application'...//添加下面这行apply from: 'https://gitee.com/numeron/brick/raw/master/brick.gradle' 
  1. 如果想加快编译速度,可以把该脚本下载下来放在与settings.gradle相同的文件夹里,然后把apply改为:
apply from: '../brick.gradle'

注:第2步和第3步任选其一即可配置brick。

使用

一、 @Provide注解的使用方法:

  1. 在你编写好的ViewModel子类上添加@Provide注解
@Provideclass WxAuthorViewModel: ViewModel() {    ...}
  1. 有3种方式让brick注解处理器开始工作:
  • Terminal终端上输入gradlew :[ModuleName]:kaptDebugKotlin运行脚本;
  • AndroidStudio右侧Gradle扩展栏中依次找到[PrjectName] -> [ModuneName] -> Tasks -> other -> kaptDebugKotlin并双击运行脚本;
  • Ctrl + F9编译整个项目。
    以上三种方式任选其一即可运行brick注解处理器。
  1. 脚本运行结束后,会生成两个包级方法:
  • lazyWxAuthorViewModel()扩展方法,在ActivityFragment中直接调用即可。
  • getWxAuthorViewModel()方法,在不方便使用lazy方法时,可使用此方法获取ViewModel的实例。
    注:lazyWxAuthorViewModel方法就是对getWxAuthorViewModel()方法的包装。
    直接使用生成的方法,即可创建对应的ViewModel实例:
private val wxAuthorViewModel by lazyWxAuthorViewModel()

或在onCreate()之后,通过getWxAuthorViewModel创建:

private lateinit var wxAuthorViewModel: WxAuthorViewModeloverride fun onCreate(savedInstanceState: Bundle?) {    super.onCreate(savedInstanceState)    wxAuthorViewModel = getWxAuthorViewModel(this)}

二、 @Inject注解的使用方法

-2. (必需) 在获取Retrofit实例的方法上添加@RetrofitInstance,如:

@RetrofitInstanceval retrofit: Retrofit by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {    Retrofit.Builder()        .client(okHttpClient)        .baseUrl(WANDROID_BASE_URL)        .addConverterFactory(MoshiConverterFactory.create())        .build()}val okHttpClient: OkHttpClient by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {    val logInterceptor = HttpLoggingInterceptor()    logInterceptor.level = HttpLoggingInterceptor.Level.BODY    OkHttpClient.Builder()        .addInterceptor(logInterceptor)        .callTimeout(15, TimeUnit.SECONDS)        .readTimeout(60, TimeUnit.SECONDS)        .writeTimeout(60, TimeUnit.SECONDS)        .connectTimeout(15, TimeUnit.SECONDS)        .build()}

注:@RetrofitInstance注解只能标记在public修饰的val属性上或方法上,val属性上或方法可以在object 单例companion object中,也可以是包级属性/方法。

-1. (可选) 在获取RoomDatabase实例的属性或方法上标记@RoomInstance,如:

@RoomInstanceval wandroidDatabase: WandroidDatabase by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {    Room.databaseBuilder(CONTEXT, WandroidDatabase::class.java, "wandroid.db")        .build()}

注:@RoomInstance注解只能标记在public修饰的val属性上或方法上,val属性上或方法可以在object 单例companion object中,也可以是包级属性/方法。

  1. 假设已有Retrofit Api接口和WxAuthorRepo
interface WxAuthorApi {    @GET("wxarticle/chapters/json  ")    suspend fun getWxAuthorList(): List<WxAuthor>}class WxAuthorRepo {    ...}
  1. 在WxAuthorRepo中添加lateinit var修饰的WxAuthorApi字段,并用@Inject标记:
class WxAuthorRepo {    @Inject    lateinit var wxAuthorApi: WxAuthorApi}
  1. 在ViewModel中创建lateinit var修饰的WxAuthorRepo字段,并用@Inject标记:
@Provideclass WxAuthorViewModel: ViewModel() {    @Inject    private lateinit var wxAuthorRepo: WxAuthorRepo}

标记后,继续编写业务代码即可,所有被@Inject标记的字段,都会在编译期自动获取或创建实例,无需担心它们在何时被赋值。
注:虽然是lateinit var修饰的字段,但是不要尝试为它们赋值,这会导致致命的错误。
注:@Inject可以注入的类型只有Retrofitapi接口和ROOMdao接口、以及有无参构造的类。

三、 多服务器或多端口的处理方法:

假设有另一个Retrofit api接口,它的访问地址或端口与baseUrl中的不一样,此时,可以在Retrofitapi接口上添加@Port@Url注解来设置它们的url或port。

  1. @Port的使用:
@Port(1080)interface ArticleApi {    @GET("wxarticle/list/{chapterId}/{page}/json")    suspend fun getArticleList(@Path("chapterId") chapterId: Int, @Path("page") page: Int): Paged<Article>}

添加此注解后,brick会在编译期根据@RetrofitInstance注解标记的Retrofit实例和@Port的端口号,重新创建一个Retrofit实例,并使用新的Retrofit实例创建ArticleApi的实例。

  1. @Url的使用:
@Url("http://www.wanandroid.com:1080/")interface ArticleApi {    @GET("wxarticle/list/{chapterId}/{page}/json")    suspend fun getArticleList(@Path("chapterId") chapterId: Int, @Path("page") page: Int): Paged<Article>}

@Port的使用基本一致,实现的原理也是一样的。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap