Kotlin偏好設置

Kotlin的強悍震撼了我,android中每一個應用都會用到SharedPreference在Kotlin中使用竟是如此簡單!javascript

package com.android.extkt

import android.content.Context
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty

/**
 * Preference
 *
 * @author 祁連山™
 * @date 2016-12-09
 * @version 1.0
 */

class Preference<T>(val context: Context, val name: String, val default: T) : ReadWriteProperty<Any?, T> {

    val prefs by lazy { context.getSharedPreferences("default", Context.MODE_PRIVATE) }

    override fun getValue(thisRef: Any?, property: KProperty<*>): T {
        return findPreference(name, default)
    }

    override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
        putPreference(name, value)
    }

    private fun <U> findPreference(name: String, default: U): U = with(prefs) {
        val res: Any = when (default) {
            is Long -> getLong(name, default)
            is String -> getString(name, default)
            is Int -> getInt(name, default)
            is Boolean -> getBoolean(name, default)
            is Float -> getFloat(name, default)
            else -> throw IllegalArgumentException("This type can not be saved")
        }
        res as U
    }

    private fun <U> putPreference(name: String, value: U) = with(prefs.edit()) {
        when (value) {
            is Long -> putLong(name, value)
            is String -> putString(name, value)
            is Int -> putInt(name, value)
            is Boolean -> putBoolean(name, value)
            is Float -> putFloat(name, value)
            else -> throw IllegalArgumentException("This type can not be saved")
        }.apply()
    }
}

 使用時直接讀取賦值,不再用edit、commit,以咱們最經常使用的引導頁判斷來講,若是是第一次進入應用跳轉到GuideActivity,不然啓動MainActivity,使用Kotlin碼出來就是下面這個樣子:html

package com.android.kotlin

import android.content.Intent
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import com.android.extkt.Preference
import rx.Observable
import rx.android.schedulers.AndroidSchedulers
import rx.schedulers.Schedulers
import java.util.concurrent.TimeUnit

class SplashActivity : AppCompatActivity() {

    private var first: Boolean by Preference(this, "first", true)

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

        val observable = Observable.timer(3000, TimeUnit.MILLISECONDS)
        observable.observeOn(AndroidSchedulers.mainThread())
        observable.subscribeOn(Schedulers.io())
        observable.subscribe({ route() })
    }

    override fun onBackPressed() {
        return
    }

    fun route(): Unit {
        var intent = Intent()
        if (first) {
            intent.setClass(this, GuideActivity::class.java)
            startActivity(intent)
            // 能夠在這裏直接存儲first的值
            // first = false
            this.finish()
            return
        }
        intent.setClass(this, MainActivity::class.java)
        startActivity(intent)
        this.finish()
    }
}

在Kotlin中,聲明成員屬性,除了直接賦值,還能夠用 Delegate 的方式來聲明,這個 Delegate 須要根據成員的類型(val 或者 var)來提供相應的 getValue 和 setValue 方法,好比一個可讀寫的 Delegate,須要提供下面的方法:java

public interface ReadWriteProperty<in R, T> {
    
    public operator fun getValue(thisRef: R, property: KProperty<*>): T

    public operator fun setValue(thisRef: R, property: KProperty<*>, value: T)
}


-------------------------------------------------------------我是分隔線-------------------------------------------------------------

      最近項目已經使用kt來完成,用到這裏時,須要清除所有緩存數據,很差一個個賦值清除,Preference有clear()卻無法用,這時就須要對Preference這個代理類進行改造,也沒什麼可多說的,只是由於上午改的時候寫錯了,發現無法使用,下午單獨寫個demo時才發現,分享出來。

python

package com.android.app

import android.content.Context import kotlin.properties.ReadWriteProperty import kotlin.reflect.KProperty
/** * Preference * * @author 祁連山 * @date 2016-12-09 * @version 1.0 */ class Preference<T>(val context: Context) : ReadWriteProperty<Any?, T> { var key: String? = null var value: T? = null constructor(context: Context, name: String, default: T) : this(context) { key = name value = default } val prefs by lazy { context.getSharedPreferences("default", Context.MODE_PRIVATE) } override fun getValue(thisRef: Any?, property: KProperty<*>): T { return findPreference(key!!, value!!) } override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { putPreference(key!!, value) } fun delete(vararg key: String): Unit { if (key.size == 0) { prefs.edit().clear().commit() return } for (i in 0..key.size) { prefs.edit().remove(key[i]).commit() } } private fun <U> findPreference(name: String, default: U): U = with(prefs) { val res: Any = when (default) { is Long -> getLong(name, default) is String -> getString(name, default) is Int -> getInt(name, default) is Boolean -> getBoolean(name, default) is Float -> getFloat(name, default) else -> throw IllegalArgumentException("The data can not be saved") } res as U } private fun <U> putPreference(name: String, value: U) = with(prefs.edit()) { when (value) { is Long -> putLong(name, value) is String -> putString(name, value) is Int -> putInt(name, value) is Boolean -> putBoolean(name, value) is Float -> putFloat(name, value) else -> throw IllegalArgumentException("The data can not be saved") }.apply() } }


      使用方法與原來無異,只是用到Preference對象時,用主構造方法來獲取,代碼以下:

android

...
var prefs = Preference(this)
prefs.delete()
...

 

代碼出處:http://www.jcodecraeer.com
代碼下載:https://pan.baidu.com/s/1eR4i4ca
其餘資料:http://blog.csdn.net/TIANLANG3/article/details/53926273緩存

相關文章
相關標籤/搜索