Объект не добавляется в ArrayList внутри класса Thread of Application - PullRequest
0 голосов
/ 01 июля 2018

Я работаю с Kotlin в разработке приложений для Android.

Это код, который я пытаюсь запустить при создании экземпляра приложения

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. Но если я вызову execute () вне Thread, например:

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 с, поскольку система занята обработкой 479 тыс. Слов внутри words.txt.

Как я могу заставить execute() работать внутри потока?

1 Ответ

0 голосов
/ 01 июля 2018

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()
...