Зачем консольному приложению kotlin выполнять все асинхронные задачи перед выходом из программы? - PullRequest
0 голосов
/ 22 января 2019

У меня есть приложение командной строки, которое выполняет некоторые асинхронные задачи:

class Main {
    companion object {

        @JvmStatic
        fun main(args: Array<String>) {

            GlobalScope.run {
                launch {
                    FetchMovies().execute(7)
                }
            }
        }
    }
} 

Я запускаю метод main с помощью gradle, здесь конфигурация:

apply plugin: 'application'

mainClassName = 'br.com.alessi.parser.main.Main'

// optional:  add one string per argument you want as the default JVM args
applicationDefaultJvmArgs = ["-Xms512m", "-Xmx1g"]

Итак, я запускаю его: $ ./gradlew run

Когда я его запускаю, программа не подходит для асинхронных выполнений.Как я скажу моей программе подождать, пока FetchMovie (). Execute () не завершится?

Я пытался с Thread.sleep (), но это, конечно, немного неточно.

--- EDIT

из документации сопрограмм Я мог бы сделать это:

val job = GlobalScope.run {
                launch {
                    FetchMovies().execute(7)
                }
            }

            job.join()

Но я не могу вызвать job.join () внутри не приостановленного метода, и если я сделаю основной приостановленный, я не могу работать с помощью командылиния.

1 Ответ

0 голосов
/ 22 января 2019

Вы пытались использовать runBlocking, как в этом примере из документа сопрограмм.

import kotlinx.coroutines.*

fun main() = runBlocking { // this: CoroutineScope
    launch { // launch new coroutine in the scope of runBlocking
        delay(1000L)
        println("World!")
    }
    println("Hello,")
}

Это работает, как описано в следующем build.gradle

plugins {
    id 'org.jetbrains.kotlin.jvm' version '1.3.11'
}
apply plugin: 'application'
mainClassName = "MainKt"
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.0'
//    implementation "io.reactivex.rxjava2:rxjava:2.2.5"
}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...