对象未添加到应用程序线程内的 ArrayList class

Object not being added to ArrayList inside a Thread of Application class

我正在 Android 应用程序开发中使用 Kotlin。

这是我在实例化应用程序时 运行 尝试使用的代码

class SpeechApp: Application() {
    var isDictionaryRead = false
    lateinit var wordslist : ArrayList<String>

    override fun onCreate() {
        super.onCreate()
        wordslist = ArrayList()

        Thread {
            Runnable {
                execute()
            }
        }.start()
    }

    fun execute() {
        val inputStream = assets.open("words.txt")
        val reader = BufferedReader(InputStreamReader(inputStream))

        var line = reader.readLine()
        while (line != null) {
            Log.i("Read" , line)
            wordslist.add(line)
            line = reader.readLine()
        }
        isDictionaryRead = true
    }
}

我希望这段代码能正常工作,但在我的日志中我看不到任何添加了标签 Read 的行。但是,如果我在 Thread 外部调用 execute() ,例如:

class SpeechApp: Application() {
    var isDictionaryRead = false
    lateinit var wordslist : ArrayList<String>

    override fun onCreate() {
        super.onCreate()
        wordslist = ArrayList()

        execute()
    }

    fun execute() {
        val inputStream = assets.open("words.txt")
        val reader = BufferedReader(InputStreamReader(inputStream))

        var line = reader.readLine()
        while (line != null) {
            Log.i("Read" , line)
            wordslist.add(line)
            line = reader.readLine()
        }
        isDictionaryRead = true
    }
}

我可以在 logcat 中看到很多带有 "Read" 标签的行。我不希望它以这种方式工作,因为在我看到我的 MainActivity 之前有大约 5 秒的可见延迟,因为系统正忙于处理 words.txt.

中的 479k 个单词

如何让 execute() 在线程内工作?

Runnable实际上永远不会运行。相反 运行 手动或使用适当的构造函数:

Thread { execute() }.start()

Thread(::execute).start()

Thread(Runnable {
    execute()
}).start()

Thread {
    Runnable {
        execute()
    }.run()
}.start()

当不对构造函数使用 SAM 转换时,问题的原因更明显:

Thread(object : Runnable {
    override fun run() {
        Runnable {
            execute()
        }
    }
}).start()