热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

AndroidKoin2基本使用的那件事儿

这篇文章主要给大家介绍了关于AndroidKoin2基本使用的那件事儿,文中通过示例代码介绍的非常详细,对各位Android开发者们具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

首先什么是KOIN?

适用于 Kotlin 开发人员的实用轻量级依赖注入框架。

用纯 Kotlin 编写,仅使用功能分辨率:无代理,无代码生成,无反射。

PS:KOIN 支持 Kotion 和 Java

Koin 怎么配置?

本文主要讲解 Koin (2.0.1) 在AndroidX中的使用,所以直接添加 koin-android 依赖

首先添加 Koin Android 基本依赖

// Koin for Android
implementation "org.koin:koin-android:$koin_version"

如果需要使用到 Scope(范围) 控制,则依赖  koin-androidx-scope

// Koin AndroidX Scope features
implementation "org.koin:koin-androidx-scope:$koin_version"

如果项目中使用到ViewModel,那么毫不犹豫依赖 koin-androidx-viewmodel

// Koin AndroidX ViewModel features
implementation "org.koin:koin-androidx-viewmodel:$koin_version"

既然使用Kotlin,扩展功能怎么能少呢?添加 koin-androidx-ext

// Koin AndroidX Experimental features
implementation "org.koin:koin-androidx-ext:$koin_version"

Koin 怎么使用?

Koin 入门使用相当容易,学会下面几个关键词就 OK 了,跟着来看看哦~

factory

今天 Activity 需要一个 Girl(嗯~,可能是几个),那我们就创建个依赖对象使用 Koin 注入给它,这时我需要每次都给它个新的(使用factory):

val girlModule = module {
 factory {
 Girl()
 }
}

依赖对象有了,我得让 Koin 知道,所以需要在我们的 Application 初始化:

override fun onCreate() {
 super.onCreate()
 startKoin {
 androidLogger(Level.DEBUG)
 androidContext(this@App)
 androidFileProperties()
 modules(listOf(girlModule))
 }
}

现在好像什么都有,接下来当 Activity 需要时该怎么给它呢?看 Activity 代码:

// 注释掉的是另一种写法
class Simple1Activity : AppCompatActivity() {

 private val girl by inject()
 //private lateinit var girl: Girl

 override fun onCreate(savedInstanceState: Bundle?) {
 super.onCreate(savedInstanceState)
 setContentView(R.layout.activity_sample1)

 //girl = get()
 ivImage.setImageResource(girl.getGirl())
 }
}

看脸都是一个人啊!怎么知道每次都是个新 Girl 呢?直接检查 Girl 的身份证:

System.out: ---->com.joker.koin.model.Girl@a5b751b
System.out: ---->com.joker.koin.model.Girl@727e094
System.out: ---->com.joker.koin.model.Girl@e005b30

K,原来是3胞胎...

single

现在都什么时代了,不能给它享受多个 Girl 啊,那就把 factory 换成 single,动手试试检查 Girl 证件:

val girlModule = module {
 single {
 Girl()
 }
}

System.out: ---->com.joker.koin.model.Girl@48146b8
System.out: ---->com.joker.koin.model.Girl@48146b8
System.out: ---->com.joker.koin.model.Girl@48146b8

如此简单的我们就实现了单例。什么?同时要2个 Girl,还要不同类型且要是固定的。没问题我们有 Qualifier 和 Definition

val girlModule = module {
 single(named("girl1")) { (type: String) ->
 Girl().apply {
  this.type = type
 }
 }

 single(named("girl2")) { (type: String) ->
 Girl().apply {
  this.type = type
 }
 }
}

看看 Activity 怎么样了:

class Simple2Activity : AppCompatActivity() {

 private val girl1 by inject(named("girl1")) { parametersOf("可爱") }
 private val girl2 by inject(named("girl2")) { parametersOf("性感") }

 override fun onCreate(savedInstanceState: Bundle?) {
 super.onCreate(savedInstanceState)
 setContentView(R.layout.activity_sample1)

 ivImage.setImageResource(girl1.getGirl())

 ivImage.postDelayed({
  ivImage.setImageResource(girl2.getGirl())
 }, 3000)
 }
}

scope

scope 是个什么东西呢?我理解是使用范围,类似于生命周期,我们可以控制它的存活范围。

来个其他的栗子换个口味,先奉上效果图:

val girlModule = module {
 scope(named("scope")) {
 scoped {
  ScopeEntity()
 }
 }
}

scope 必须得指定 Qualifier,创建了 scope 依赖。接下来就是 createScope 和 bindScope,在这里设置了默认值  "Scope1Activity":

class Scope1Activity : AppCompatActivity() {

 override fun onCreate(savedInstanceState: Bundle?) {
 super.onCreate(savedInstanceState)
 setContentView(R.layout.activity_scope1)
 
 //创建 scope 需要指定 id 和 qualifier,getScope 需要id
 val scope1 = getKoin().createScope("scope1", named("scope"))
 //默认绑定onDestory
 bindScope(scope1)

 scope1.get().text = "Scope1Activity"

 tvText.text = scope1.get().text

 btn.setOnClickListener {
  startActivity(Intent(this, Scope2Activity::class.java))
 }
 }

 override fun onResume() {
 super.onResume()

 tvText.text = getKoin().getScope("scope1").get().text
 }
}

在 Scope2Activity 使用 getScope 获取并修改新值 "Scope2Activity":

class Scope2Activity : AppCompatActivity() {

 override fun onCreate(savedInstanceState: Bundle?) {
 super.onCreate(savedInstanceState)
 setContentView(R.layout.activity_scope1)

 val scope1 = getKoin().getScope("scope1")

 scope1.get().text = "Scope2Activity"

 tvText.text = scope1.get().text

 }
}

在 Scope1Activity 执行 onDestory 时,帮定在其中的 scope 就已经 close 了,这时再 getScope 将抛出异常:

 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
 super.onActivityResult(requestCode, resultCode, data)
 //验证 scope销毁 延时是为了保证 Scope1Activity 已经执行 onDestory
 scope.postDelayed({
  scope.text = try {
  getKoin().getScope("scope1").get().text
  } catch (e: Exception) {
  "scope back"
  }
 }, 3000)
 }

描述下流程:

  • 在 Scope1Activity 创建了 scope1 设置值,并且绑定(bindScope)了范围。
  • 跳转到 Scope2Activity 先显示原有值,修改后返回。由于 Scope1Activity 没有销毁,所以在 onResume 显示了新值。
  • 返回 MainActivity ,由于 scope 特性,此时已经获取不到相应的值了。

Demo 地址: github.com/joker-fu/sa…(本地下载)

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。


推荐阅读
  • 嵌入式开发环境搭建与文件传输指南
    本文详细介绍了如何为嵌入式应用开发搭建必要的软硬件环境,并提供了通过串口和网线两种方式将文件传输到开发板的具体步骤。适合Linux开发初学者参考。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 本文详细介绍了如何在 Spring Boot 应用中通过 @PropertySource 注解读取非默认配置文件,包括配置文件的创建、映射类的设计以及确保 Spring 容器能够正确加载这些配置的方法。 ... [详细]
  • 解决微信电脑版无法刷朋友圈问题:使用安卓远程投屏方案
    在工作期间想要浏览微信和朋友圈却不太方便?虽然微信电脑版目前不支持直接刷朋友圈,但通过远程投屏技术,可以轻松实现在电脑上操作安卓设备的功能。 ... [详细]
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
  • 通过Web界面管理Linux日志的解决方案
    本指南介绍了一种利用rsyslog、MariaDB和LogAnalyzer搭建集中式日志管理平台的方法,使用户可以通过Web界面查看和分析Linux系统的日志记录。此方案不仅适用于服务器环境,还提供了详细的步骤来确保系统的稳定性和安全性。 ... [详细]
  • 科研单位信息系统中的DevOps实践与优化
    本文探讨了某科研单位通过引入云原生平台实现DevOps开发和运维一体化,显著提升了项目交付效率和产品质量。详细介绍了如何在实际项目中应用DevOps理念,解决了传统开发模式下的诸多痛点。 ... [详细]
  • 简化报表生成:EasyReport工具的全面解析
    本文详细介绍了EasyReport,一个易于使用的开源Web报表工具。该工具支持Hadoop、HBase及多种关系型数据库,能够将SQL查询结果转换为HTML表格,并提供Excel导出、图表显示和表头冻结等功能。 ... [详细]
  • 在 Android 开发中,通过 Intent 启动 Activity 或 Service 时,可以使用 putExtra 方法传递数据。接收方可以通过 getIntent().getExtras() 获取这些数据。本文将介绍如何使用 RoboGuice 框架简化这一过程,特别是 @InjectExtra 注解的使用。 ... [详细]
  • 本章详细介绍SP框架中的数据操作方法,包括数据查找、记录查询、新增、删除、更新、计数及字段增减等核心功能。通过具体示例和详细解析,帮助开发者更好地理解和使用这些方法。 ... [详细]
  • 本文探讨了如何在Classic ASP中实现与PHP的hash_hmac('SHA256', $message, pack('H*', $secret))函数等效的哈希生成方法。通过分析不同实现方式及其产生的差异,提供了一种使用Microsoft .NET Framework的解决方案。 ... [详细]
  • CentOS 7.6环境下Prometheus与Grafana的集成部署指南
    本文旨在提供一套详细的步骤,指导读者如何在CentOS 7.6操作系统上成功安装和配置Prometheus 2.17.1及Grafana 6.7.2-1,实现高效的数据监控与可视化。 ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
  • 本文详细介绍了如何在云服务器上配置Nginx、Tomcat、JDK和MySQL。涵盖从下载、安装到配置的完整步骤,帮助读者快速搭建Java Web开发环境。 ... [详细]
author-avatar
Justine-zhu
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有