纯kotlin+ViewModel+LiveData+协程MVVM

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了纯kotlin+ViewModel+LiveData+协程MVVM相关的知识,希望对你有一定的参考价值。

参考技术A

MVVM大家都了解差不多了,但是我发现MVVM整成架构时,每个人的写法真的是千差万别。

除了MVVM必要的ViewModel、LiveData,其它写法也没有统一的标准,看下来写法特别多,jetpack、kotlin、java、databinding、rxjava、协程、操作符等等各种混用,甚至还有把mvp的presenter当vm使用的,有的项目混用的多了看起来真的很不直观,没法用到实际项目中。

那就自己写一个简单的纯净版mvvm,不用jetpack、databinding、rxjava、晦涩的操作符等。同时也练习一下kotlin各种高阶函数、扩展、新特性等。git地址 https://github.com/wushaoge/WsgMvvm

https://github.com/Reginer/MVVMHub
https://www.pgyer.com/eyepetizer
这两个项目强烈建议多学习

所有数据来源于开眼,仅供学习和交流使用,严禁用于任何商业用途,原作公司拥有所有权利。

如何在 kotlin 中读取纯文本文件?

【中文标题】如何在 kotlin 中读取纯文本文件?【英文标题】:How to read plain text file in kotlin? 【发布时间】:2019-08-06 12:45:56 【问题描述】:

在 kotlin 中读取纯文本文件可能有多种方式。

我想知道有哪些可能的方法以及如何使用它们。

【问题讨论】:

【参考方案1】:

1.使用 BufferedReader

    import java.io.File
    import java.io.BufferedReader

    fun main(args: Array<String>) 
        val bufferedReader: BufferedReader = File("example.txt").bufferedReader()    
        val inputString = bufferedReader.use  it.readText() 
        println(inputString)
    

2。使用输入流

逐行阅读

    import java.io.File
    import java.io.InputStream

    fun main(args: Array<String>) 
        val inputStream: InputStream = File("example.txt").inputStream()
        val lineList = mutableListOf<String>()

        inputStream.bufferedReader().forEachLine  lineList.add(it)  
        lineList.forEachprintln(">  " + it)
    

读取所有行

    import java.io.File
    import java.io.InputStream

    fun main(args: Array<String>) 
        val inputStream: InputStream = File("example.txt").inputStream()
        val inputString = inputStream.bufferedReader().use  it.readText() 
        println(inputString)
    

3.直接使用文件

    import java.io.File
    import java.io.BufferedReader

    fun main(args: Array<String>) 
        val lineList = mutableListOf<String>()

        File("example.txt").useLines  lines -> lines.forEach  lineList.add(it) 
        lineList.forEach  println(">  " + it) 
    

【讨论】:

File.useLines() 这对我来说是新的。让我们看看出现在哪个版本的 jdk 中。哦,那是 Reader 的 Kotlin 插件。【参考方案2】:

Anisuzzaman 的回答列出了几种可能性。

它们之间的主要区别在于文件是作为单个String读入内存,读入内存并拆分为行,还是逐行读取。

显然,一次将整个文件读入内存可能会占用更多内存,因此除非确实有必要,否则应避免这种情况。 (文本文件可以任意大!)所以使用BufferedReader.useLines() 逐行处理通常是一个好方法。

其余的差异大多是历史性的。非常早期的 Java 版本使用 InputStream &c 不能正确区分字符和字节; Reader &c 被添加来纠正这个问题。 Java 8 添加了使用流更有效地逐行读取的方法(例如Files.lines())。最近,Kotlin 添加了自己的扩展函数(例如BufferedReader.useLines()),使其更加简单。

【讨论】:

【参考方案3】:

这里的答案都是基于 Kotlin Java 的。这是一种读取文本文件的 Kotlin Native 方式:

val bufferLength = 64 * 1024
val buffer = allocArray<ByteVar>(bufferLength)

 for (i in 1..count) 
    val nextLine = fgets(buffer, bufferLength, file)?.toKString()
    if (nextLine == null || nextLine.isEmpty()) break

    val records = parseLine(nextLine, ',')
    val key = records[column]
    val current = keyValue[key] ?: 0
    keyValue[key] = current + 1



fun parseLine(line: String, separator: Char) : List<String> 
    val result = mutableListOf<String>()
    val builder = StringBuilder()
    var quotes = 0
    for (ch in line) 
        when 
            ch == '\"' -> 
                quotes++
                builder.append(ch)
            
            (ch == '\n') || (ch ==  '\r') -> 
            (ch == separator) && (quotes % 2 == 0) -> 
                result.add(builder.toString())
                builder.setLength(0)
            
            else -> builder.append(ch)
        
    
    return result

见:https://github.com/JetBrains/kotlin-native/blob/master/samples/csvparser/src/csvParserMain/kotlin/CsvParser.kt

【讨论】:

哪些是关键文件访问标准,以及为读取的数据创建字符串和数据结构的额外绒毛是什么?【参考方案4】:

要读取文本文件,必须首先创建它。在 Android Studio 中,您可以像这样创建文本文件:

1) 选择垂直工具栏顶部的“项目”,打开项目“工具窗口” 2)从“工具窗口”顶部的下拉菜单中,选择“Android” 3) 右键单击​​“应用程序”并选择“新建” 然后->“文件夹”(旁边有绿色Android图标的那个) 然后->“资产文件夹” 4) 出现在“工具窗口”中后,右键单击“assets”文件夹 5) 选择“新建”->“文件” 6) 命名文件,如果是文本文件,则包含扩展名“.txt”,如果是WebView,则包含扩展名“.html” 7) 编辑文件或将文本剪切并粘贴到其中。该文件现在将显示在“工具窗口”中的“项目”文件下,您可以随时双击它进行编辑。

要访问此文件,请使用“application.assets”前缀。其次是一些功能(文件名)。例如(在 Kotlin 中):

val fileName = "townNames.txt"
val inputString = application.assets.open(fileName).bufferedReader().use  it.readText() 
val townList: List<String> = inputString.split("\n")

【讨论】:

【参考方案5】:

我认为最简单的编码方式是使用 kotlin.text 和 java.io.File

import java.io.File

fun main(args: Array<String>) 
    val text = File("sample.txt").readText()
    println(text)

【讨论】:

以上是关于纯kotlin+ViewModel+LiveData+协程MVVM的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 中的 ViewModel:未解决的参考

Android : Kotlin : MVVM : 为啥 viewModel.onButtonClicked() 会导致应用程序崩溃?

如何将editText值传递给viewModel和Livedata(Kotlin)

Android - ViewModel、LiveData、Room 和 Retrofit 以及协程放在 kotlin 中

无法创建类 ViewModel kotlin 的实例

如何使用 viewmodel android kotlin 设置 Imageview 动画