lyt 发布的文章

常用功能,其它上网就可以:

//状态栏
implementation 'com.gyf.immersionbar:immersionbar:3.0.0'

在每个ActivityOnCreate方法增加这个就可以

ImmersionBar.with(this)
    .transparentBar() // 透明
    .hideBar(BarHide.FLAG_HIDE_BAR) // 隐藏状态和导航条
    .init()

先引入库:

implementation 'com.tencent:mmkv-static:1.2.10'

这封装一个类

import android.widget.EditText
import android.widget.TextView
import androidx.annotation.Nullable
import com.tencent.mmkv.MMKV
import kotlinx.android.synthetic.main.activity_login_by_password.*
import java.lang.Exception

/**
 * 保存本地数据KEY
 */
object Save {
    /**
     * 常用保存
     */
    fun set(key: String, @Nullable value: Any) {
        when (value) {
            is String -> MMKV.defaultMMKV().encode(key, value)
            is Boolean -> MMKV.defaultMMKV().encode(key, value)
            is Long -> MMKV.defaultMMKV().encode(key, value)
            is Int -> MMKV.defaultMMKV().encode(key, value)
            is Double -> MMKV.defaultMMKV().encode(key, value)
            is Float -> MMKV.defaultMMKV().encode(key, value)
            else -> throw Exception("暂时不支持这类型");
        }
    }

    /**
     * 读取
     */
    fun get(key: String): String? {
        return MMKV.defaultMMKV().decodeString(key)
    }
    fun getLong(key: String): Long {
        return MMKV.defaultMMKV().decodeLong(key)
    }
    fun getInt(key: String): Int {
        return MMKV.defaultMMKV().decodeInt(key)
    }
    fun getBool(key: String): Boolean {
        return MMKV.defaultMMKV().decodeBool(key)
    }
    fun getDouble(key: String): Double {
        return MMKV.defaultMMKV().decodeDouble(key)
    }
    fun getFloat(key: String): Float {
        return MMKV.defaultMMKV().decodeFloat(key)
    }

    /**
     * 直接将值保存到EditText
     */
    fun setEditText(key: String, edit: EditText) {
        var value = MMKV.defaultMMKV().decodeString(key)
        value.let {
            edit.setText(it)
        }
    }

    /**
     * 直接将值保存到TextView
     */
    fun setTextView(key: String, edit: TextView) {
        var value = MMKV.defaultMMKV().decodeString(key)
        value.let {
            edit.text = it
        }
    }
}

类型判断并且转成类型:

fun hasPrefix(x: Any) = when(x) {
    is String -> x.startsWith("prefix")
    else -> false
}

范围:
when (x) {

    in 1..10 -> print("x is in the range")
    in validNumbers -> print("x is valid")
    !in 10..20 -> print("x is outside the range")
    else -> print("none of the above")
}

示例代码声明

class Developer (@JvmField val name: String, val ide: String)

使用@JvmField,我们在Java中调用的时候,可以直接使用属性名,而不是对应的getter方法。

//test jvmField

Developer developer = new Developer("Andy", "Android Studio");
System.out.println(developer.getIde());// not using JvmField
System.out.println(developer.name);// using JvmField

    fun t1(name:String) = flow{
        println("flow start : $name")
        for(i in 0..3){
            kotlinx.coroutines.delay(100)
            emit("$name $i")// 向外面发一个数据
        }
    }

    runBlocking{// 所有线程一起运行(顺序的话就删除launch就好)执行线程(流)执行完
        launch {
            t1("1").collect {
                println("get1 $it")
            }
        }

        // 开启第二个流
        launch {
            t1("2").collect {
                println("get2 $it")
            }
        }

        // 同一个流监听两次
        launch {
            val t = t1("3")
            t.collect {
                println("get4 $it")
            }
            t.collect {
                println("get4 $it")
            }
        }
    }

快速创建:

(1..3).asFlow().collect { value -> println(value) }

但是你不能修改延迟,所以可以增加map处理,或者增加过虑 filter

    runBlocking {
        launch {
                (1..10).asFlow() // 一个请求流
                    .filter {
                        it % 2 == 0 // 只显示偶数
                    }
                    .map {
                        // 每个个过来的都延迟1000秒
                        delay(100)
                        "hi $it";
                    }
                    .collect { response -> // 指定变量名字,不再是it
                        println(response)
                        println(response)
                        // 这里延迟也有用的
                        delay(1000)
                    }
        }

增加数据:

(1..3).asFlow() // 一个请求流
.transform { request ->
    emit("Making request $request") 
    emit(performRequest(request)) 
}
.collect { response -> println(response) }

限制数据,例如只处理两次:

fun numbers(): Flow<Int> = flow {
    try {                          
        emit(1)
        emit(2) 
        println("This line will not execute")
        emit(3)    
    } finally {
        println("Finally in numbers")
    }
}

fun main() = runBlocking<Unit> {
    numbers() 
        .take(2) // 只获取前两个
        .collect { value -> println(value) }
} 

更多参考这个