2017-05-10 29 views
0

私はKotlinとコルーチンを初めて使用しています。しかし、私は長期間実行されているAndroid ThreeTenバックポートライブラリの初期化にこれを使用したいと考えています。私はMetalab Async/Await Library(co.metalab.asyncawait:asyncawait:1.0.0)を使用しています。非同期待機待ちではありません

これは私のコードです:

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

    } 
} 

今、私はUIを初期化するとき、ライブラリが初期化されていない問題を抱えています。私の理解から、AndroidThreeTen.initが呼び出される前に、initUIを呼び出すべきではありません。

+0

あなたが最初に(バックグラウンドでまたは早く)データ第二のUIをロードする必要があります。そうしないとhttp://stackoverflow.com/a/43151714/882912データをロードしている間はUIをフリーズします。そうすることで、進行状況バーを表示することができます。 – KTCO

答えて

4

簡単な答えは、コトルリンコルーチンを使用しないことです。

長い答えは、あなたのコードは、あなたがとにかくinitUIを起動しようとする前に終了するAndroidThreeTen.initためを待たなければならないので、あなたは、あなたのUIを初期化前を初期化することがAndroidThreeTenを必要としていることです。待つ必要があるため、コードを複雑にする理由はほとんどありません。コルーチンは魔法ではありません。彼らは何とか時間がかかる何かを待つことはありません。 AndroidThreeTen.initは、コルーチンを使用して、またはコルーチンを使用せずに同じ時間がかかります。

あなたはちょうどこのようなあなたのコードを書く必要があります。

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

    val application = this 

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

あなたの答えをありがとう。一方であなたは正しいです、それはパフォーマンスに何も追加しません。一方、私はまだ私のコードが動作しない理由を理解していません。それは悪い習慣である空白のために[それはここのような]です(https://stackoverflow.com/questions/36115580/async-await-not-waiting?rq=1)? – Alexander

+0

それは、Metalab Async/Await Libraryの著者が答えることができるかもしれないという疑問です。 'kotlinx.coroutines'を使っていたら、それを書くとhttps://gist.github.com/elizarov/0b3e3386d304478368b3eb0380b6f25aが動作します –

関連する問題