2017-05-10 4 views
0

Ich bin neu in Kotlin und die Coroutines. Ich möchte es jedoch verwenden, um die Android ThreeTen Backport-Bibliothek zu initialisieren, die eine lang andauernde Aufgabe ist. Ich verwende die Metalab Async/Await Library (co.metalab.asyncawait:asyncawait:1.0.0).Async nicht warten auf erwarten

Dies ist mein Code:

override fun onCreate(savedInstanceState: Bundle?) { 
    super.onCreate(savedInstanceState) 
    setContentView(R.layout.activity_main) 

    val application = this 

    async { 

     //non-blocking initialize ThreeTen 
     await { AndroidThreeTen.init(application) } 

     //initialize UI on UI thread which uses the ThreeTen library 
     initUI() 

    } 
} 

Jetzt habe ich das Problem, dass die Bibliothek nicht initialisiert wird, wenn der Benutzeroberfläche initialisiert. Aus meiner Sicht sollte initUI nicht aufgerufen werden, bevor aufgerufen wird.

+0

Sie die Benutzeroberfläche geladen werden sollte zuerst dann Daten zweite (oder früher im Hintergrund): http://stackoverflow.com/a/43151714/882912 Andernfalls Sie frieren Ihre Benutzeroberfläche ein, während Sie die Daten laden. Auf diese Weise können Sie einen Fortschrittsbalken anzeigen. – KTCO

Antwort

4

Die kurze Antwort ist, dass Sie Kotlin Koroutinen dafür nicht verwenden sollten.

Die lange Antwort ist, dass Ihr Code AndroidThreeTen initialisiert werden muss vor Sie Ihre UI initialisieren, so dass Sie sich warten AndroidThreeTen.init vor zu beenden versuchen initUI sowieso aufzurufen. Aufgrund dieser inhärenten Notwendigkeit zu warten, gibt es wenig Grund, Ihren Code zu komplizieren. Coroutines sind keine Magie. Sie werden nicht auf etwas warten, das viel schneller ist. AndroidThreeTen.init dauert die gleiche Zeit mit Koroutinen oder ohne sie.

Sie sollten nur der Code wie folgt schreiben:

override fun onCreate(savedInstanceState: Bundle?) { 
    super.onCreate(savedInstanceState) 
    setContentView(R.layout.activity_main) 

    val application = this 

    AndroidThreeTen.init(application) 
    initUI() 
} 
+1

Danke für Ihre Antwort. Auf der einen Seite hast du Recht, es fügt nichts zur Leistung hinzu. Auf der anderen Seite verstehe ich immer noch nicht, warum mein Code nicht funktioniert. Ist es [wie hier in C#] (https://stackoverflow.com/questions/36115580/async-wait-not-waiting?rq=1) wegen der Lücke, die schlechte Praxis ist? – Alexander

+0

Das wäre eine Frage, die Autoren der Metalab Async/Await Library beantworten könnten. Wenn Sie 'kotlinx.coroutines' verwenden würden, könnten Sie es so schreiben und es würde funktionieren https://gist.github.com/elizarov/0b3e3386d304478368b3eb0380b6f25a –