Как получить вывод процесса на строку в приложении для Android? - PullRequest
0 голосов
/ 30 июня 2019

Я использую этот код:

var reader: Int = 0
val buffer = CharArray(4096)
var output = StringBuilder()
val process = processBuilder.start()
var inputStream =  BufferedReader(InputStreamReader(process.getInputStream()));

while ({ reader = inputStream.read(buffer); reader }() > 0) {
       output.append(buffer, 0, reader)
       println("Debug: " + output.toString())
      }
       inputStream.close()
       process.waitFor()

Работает нормально, но у меня есть 2 проблемы, которые не соответствуют моим потребностям:

1) Он не извлекает каждую строку в реальном времени. Он буферизует некоторые строки из фактического вывода и показывает их в каждом цикле.

2) Результат добавляется. Мне нужна только фактическая и единственная строка вывода на каждой итерации.

1 Ответ

0 голосов
/ 30 июня 2019

Довольно элегантное решение Kotlin-ish:

                var output: String = ""
                val process = processBuilder.start()                 
                val inputStream =  BufferedReader(InputStreamReader(process.getInputStream()))
                while ( inputStream.readLine()?.also { output = it } != null) {
                    println("Debug: " + output)
                }
                 inputStream.close()
                 process.waitFor()

Оператор while эквивалентен Java:

                    while ( (output = inputStream.readLine()) != null) {
                        println("Debug: " + output)
                    }

В Kotlin нельзя назначать переменные внутри операторов, но используя цепочку также, вы можете включить дополнительный код, который будет выполняться одновременно.Оператор Элвиса (?) После readLine позволяет "it" обнуляться для выполнения последней проверки.Это необходимо, чтобы избежать сбоев.

...