对象未添加到应用程序线程内的 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()
我正在 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
.
如何让 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()