基于Kotlin的委托机制实现一个对Extra、SharedPreferences操作的库

简介: 基于Kotlin的委托机制实现一个对Extra、SharedPreferences操作的库

Kotlin 的委托属性



有一些很常见的属性,虽然我们可以在每次需要它们的时候手动地实现它们,但更好的方法是一次性全部实现,然后放进一个库里面。换句话说,对其属性值的操作不再依赖于其自身的getter()/setter()方法,而是将其托付给一个代理类,从而每个使用类中的该属性可以通过代理类统一管理。


委托属性的语法

val/var <property name>: <Type> by <expression>


其中,by 后面的表达式就是一个委托操作。


本文介绍的库,github地址:https://github.com/fengzhizi715/SAF-Object-Delegate

包含四个模块:


模块 extras-delegate prefs-delegate prefs-fastjson-delegate prefs-gson-delegate
最新版本 0.1.0 1.0.0 0.1.0 0.1.0


一. 封装Extra



1.1 下载安装


Gradle:

implementation 'com.safframework.delegate:extras-delegate:0.1.0'


1.2 使用


点击某个控件,跳转到下一个页面,并传递参数。

text1.click{
            val intent = Intent(this@MainActivity, Demo4ExtrasDelegateActivity::class.java)
            val u = User("Tony","123456")
            intent.putExtra("user",u)
            intent.putExtra("string","just a test")
            startActivity(intent)
        }


这里的 click 函数是一个扩展函数,可以在 https://github.com/fengzhizi715/SAF-Kotlin-Utils 找到。


从Demo4ExtrasDelegateActivity接受来自上一个Activity中传递过来的参数。

import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import com.safframework.delegate.domain.User
import com.safframework.delegate.extras.extraDelegate
import com.safframework.log.L
/**
 *
 * @FileName:
 *          com.safframework.delegate.activity.Demo4ExtrasDelegateActivity.java
 * @author: Tony Shen
 * @date: 2018-06-13 17:42
 * @version V1.0 <描述当前版本功能>
 */
class Demo4ExtrasDelegateActivity: AppCompatActivity() {
    private val user: User? by extraDelegate("user")
    private val s:String? by extraDelegate("string")
    public override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        L.json(user)
        L.i(s)
    }
}


所传递过来的任何对象类型,都可以使用如下的方式获取Extras。只要保证,extra的key正确即可。

private val user: User? by extraDelegate("user")
    private val s:String? by extraDelegate("string")


二. 封装SharedPreferences



2.1 SharedPreferences存放int、long、float、boolean、string以及Set<String>


2.1.1 下载安装


Gradle:

implementation 'com.safframework.delegate:prefs-delegate:1.0.0'


2.1.2 特点


  • 支持 SharedPreferences 的int、long、float、boolean、string以及Set<String>
  • 支持对上述类型使用 AES 算法进行加密,以保障数据安全


没有使用 AES 算法,SharedPreferences的数据文件大致是这样的:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <string name="name">tony</string>
    <string name="password">1234abcd</string>
    <int name="age" value="20" />
    <boolean name="isForeigner" value="false" />
</map>


使用了 AES 算法之后,可能会变成这样:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <string name="PUoKC8qjz+tmMUV+EVz9Pw==">x2jMB8gvbhkLpMsUuvN7VA==</string>
    <string name="/dSJ/TeQoeRnpoMvZWI67A==">lV+O+RVVrE/p4CjmBX3IbA==</string>
    <string name="viAoG1taVD8rPP9+0n4ORg==">O4DxiobDhUeGEPe0cQFrCQ==</string>
    <string name="Mq2QcYiQhvDjHwBohnGWEQ==">er4sZVGF7k45nNmUq6p7Cg==</string>
</map>


2.1.2 使用


可以编写一个 PrefsHelper,把所需要使用 SharedPreferences 保存的属性放进去。

import android.content.SharedPreferences
/**
 *
 * @FileName:
 *          com.safframework.delegate.prefs.PrefsHelper.java
 * @author: Tony Shen
 * @date: 2018-06-28 23:43
 * @version V1.0 <描述当前版本功能>
 */
class PrefsHelper(prefs: SharedPreferences) {
    var name by prefs.string("name")
    var password by prefs.string("password")
    var age by prefs.int("age")
    var isForeigner by prefs.boolean("isForeigner")
}


要使用加密功能的话,需要先初始化密钥,且密钥是16位。

import android.content.SharedPreferences
/**
 *
 * @FileName:
 *          com.safframework.delegate.prefs.EncryptPrefsHelper.java
 * @author: Tony Shen
 * @date: 2018-06-13 23:44
 * @version V1.0 <描述当前版本功能>
 */
class EncryptPrefsHelper(prefs: SharedPreferences) {
    init {
        prefs.initKey("12345678910abcde") // 初始化密钥,且密钥是16位的
    }
    var name by prefs.string("name",isEncrypt=true)
    var password by prefs.string("password",isEncrypt=true)
    var age by prefs.int("age",isEncrypt=true)
    var isForeigner by prefs.boolean("isForeigner",isEncrypt=true)
}


注意,实际使用过程中 PrefsHelper 应该是单例。


由于,com.novoda.bintray-release插件和gradle版本升级到当前最新版本。该模块也已经上传到jcenter,要是引入到项目中出现“Failed to resolve: com.safframework.delegate:prefs-delegate:1.0.0”时,可以采用临时解决方案,在项目根目录的build.gradle中添加如下的代码。

allprojects {
    repositories {
        ......
        maven{url 'https://dl.bintray.com/fengzhizi715/maven/'}
    }
}


2.2 SharedPreferences存放对象类型


支持 fastjson、gson 分别来做对象的序列化。这里做成两个库,主要是考虑到某些项目已经使用了 fastjson 或者 gson,选取合适的库避免额外添加library。


2.2.1 下载安装


使用fastjon序列化对象


Gradle:

implementation 'com.safframework.delegate:prefs-fastjson-delegate:0.1.0'


使用gson序列化对象


Gradle:

implementation 'com.safframework.delegate:prefs-gson-delegate:0.1.0'


2.2.2 使用


类似上面的 PrefsHelper,写了一个 ObjectPrefsHelper。它包含两个 user 对象,分别使用 fastjson 和 gson 来做序列化。

import android.content.SharedPreferences
import com.safframework.delegate.domain.User
/**
 *
 * @FileName:
 *          com.safframework.delegate.prefs.ObjectPrefsHelper.java
 * @author: Tony Shen
 * @date: 2018-06-29 11:56
 * @version V1.0 <描述当前版本功能>
 */
class ObjectPrefsHelper(prefs: SharedPreferences) {
    var user1 by prefs.json<User?>(null)
    var user2 by prefs.gson<User?>(null)
}


相关文章
|
4月前
|
存储 缓存 Android开发
安卓Jetpack Compose+Kotlin, 使用ExoPlayer播放多个【远程url】音频,搭配Okhttp库进行下载和缓存,播放完随机播放下一首
这是一个Kotlin项目,使用Jetpack Compose和ExoPlayer框架开发Android应用,功能是播放远程URL音频列表。应用会检查本地缓存,如果文件存在且大小与远程文件一致则使用缓存,否则下载文件并播放。播放完成后或遇到异常,会随机播放下一首音频,并在播放前随机设置播放速度(0.9到1.2倍速)。代码包括ViewModel,负责音频管理和播放逻辑,以及UI层,包含播放和停止按钮。
|
5月前
|
Java 数据库 Android开发
【专栏】Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理
【4月更文挑战第27天】本文探讨了Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理。通过案例分析展示了网络请求、图像处理和数据库操作的优化实践。同时,文章指出并发编程的挑战,如性能评估、调试及兼容性问题,并强调了多线程优化对提升应用性能的重要性。开发者应持续学习和探索新的优化策略,以适应移动应用市场的竞争需求。
113 5
|
5月前
|
前端开发 编译器 Android开发
构建高效Android应用:探究Kotlin协程的异步处理机制
【4月更文挑战第2天】在现代移动应用开发中,提供流畅且响应迅速的用户体验是至关重要的。随着Android平台的发展,Kotlin语言凭借其简洁性和功能性编程的特点成为了主流选择之一。特别地,Kotlin协程作为一种新型的轻量级线程管理机制,为开发者提供了强大的异步处理能力,从而显著提升了应用程序的性能和响应速度。本文将深入探讨Kotlin协程在Android中的应用,分析其原理、实现以及如何通过协程优化应用性能。
|
25天前
|
Kotlin
Kotlin协程的取消机制:深入理解和优雅实现
本文详细探讨了Kotlin协程的取消机制,介绍了除直接使用`Job`的`cancel`方法外的多种优雅实现策略,如`CompletableDeferred`、`isActive`检查、`ensureActive`、`yield`及`CoroutineScope`的取消等。通过这些方法,可以更好地管理协程生命周期,确保资源正确释放,提升代码健壮性和可维护性。
53 12
|
2月前
|
安全 Java 编译器
深入浅出:Kotlin 中的空安全机制
【8月更文挑战第31天】
34 0
|
4月前
|
设计模式 Java Kotlin
Kotlin中的委托、属性委托和延迟加载
Kotlin中的委托、属性委托和延迟加载
|
4月前
|
存储 API 开发工具
kotlin安卓开发,如何获取设备的唯一id, 有哪些开源库
在Kotlin的Android开发中,获取设备唯一ID的方法包括不稳定的ANDROID_ID、需要权限的IMEI、使用UUID与SharedPreference结合,以及考虑隐私的Firebase Installations ID和Advertising ID。由于隐私问题和Google Play政策,IMEI和ANDROID_ID不推荐作为长期唯一标识。推荐使用UUID(首次安装时生成并存储),或在涉及广告时使用Advertising ID(需用户同意),而Firebase Installations ID则提供了一种合规的设备标识选项。在选择方法时,必须遵守隐私指南和政策。
|
4月前
|
XML 存储 数据格式
Kotlin Fuel库:图像下载过程中的异常处理
Kotlin Fuel库:图像下载过程中的异常处理
|
5月前
|
移动开发 API Android开发
构建高效安卓应用:探究Kotlin协程的异步处理机制
【4月更文挑战第5天】 在移动开发领域,为了提升用户体验,应用必须保持流畅且响应迅速。然而,复杂的后台任务和网络请求往往导致应用卡顿甚至崩溃。本文将深入探讨Kotlin协程——一种在Android平台上实现轻量级线程管理的先进技术,它允许开发者以简洁的方式编写异步代码。我们将分析协程的核心原理,并通过实际案例演示其在安卓开发中的运用,以及如何借助协程提高应用性能和稳定性。
|
5月前
|
API 开发者 Kotlin
Kotlin 中如何使用 Fuel 库进行代理切换?
Kotlin 中如何使用 Fuel 库进行代理切换?