唯一KotlinのためのAndroid開発のCo-ルーチンはありますか?MVVM、idはすぐに活動に戻って取得するための方法を使ってAndroidの部屋からの検索?

マレク・カナバン:

これは、Androidの開発とコルーチンの使用に関する一般的な質問です。私は、Androidでの開発には比較的新しいですし、MVVMアーキテクチャモデルを使用してアプリケーションを作成しました。

私は現在、私はテーブルに挿入し、LiveData観察者のID背中を取得し、問題が生じています。私は、外部キーとして機能するように、別のテーブルに挿入するために、すぐにこのIDを使用する必要があります。一つのテーブルエントリと、そのエントリに関連する他のフィールドを定義します。

私の問題は、最初のIDの挿入がバックグラウンドで起こっていることなので、時間によってIDは、エラーがすでに投げてきた活動に返されます。

私はいくつかの方法が必要です。

  • IDが返されるのを待つのいずれか
  • または挿入がフォアグラウンドで実行(ただし、これを実行するかどうかはわからないよ)があります。

私は一つの解決策は、コルーチンを使用することです見てきましたが、これは単にKotlinソリューションのようです。

すぐに次の挿入のための使用に活動中の挿入のIDを取得するために、AndroidのJavaで動作しますソリューションの誰も知っていますか?

*私は部屋のSQLデータベースを使用しています。

トーマス・クック:

[OK]を私が間違っている場合は、私を修正しますが、私はあなたが欲しいと思うことは、同期の方法で一緒にチェーン非同期操作への道です。

だから、1非同期的にテーブルに挿入する必要があり、操作、および別のテーブルに挿入するために最初の操作の結果からIDを使用する必要がある別の操作を持っています。

だからあなたの第2の動作は、それが実行される前に、最初の操作が完了していることが必要です。疑問が生じたので、しかし、あなたの最初の操作は、バックグラウンドで実行されています。「どのように私は最初の1が終了するまで、第2の動作を発射するかわからない作るのですか?」。

これは、非同期呼び出しを「チェーン化」の概念です。または、言い換えると、同期方式で非同期呼び出しを実行します。

あなたは、Javaを使用する必要があるので、あなたは(つまり、Kotlin言語機能だから)Kotlinのコルーチンを使用することはできません。幸いなことに、Javaでこれを達成するためのいくつかの方法があります。

私は個人的にRXのJavaの使用をお勧めします。非同期操作を組み合わせるためのオペレータの負荷があります。このユースケースのためにあなたがしたいと思いますおそらく1が呼び出されたflatMap最初の操作上のブロックは、引数(複数可)としての第1の1の結果と、第2の動作を呼び出す前に、その結果オペレータです。

しかし、RXは、追加するための非常に大きな依存性であり、また、非常に学習曲線を持っています。だから、このツールを使用することを選択すると、この種の問題は、あなたのコードベースであるかprevelantに依存します。

別のオプションは、同じバックグラウンドスレッドで両方の操作を発行するために使用される共有シングルスレッドexecutorを設定することです。それは、単一のバックグラウンドスレッドであるため、限り、あなたは順次エグゼキュータにコマンドを発行すると、彼らは順番に実行しますが、バックグラウンドスレッドになります。だから、あなたはそのような連鎖操作を持つことができます(あなたがそれらを発行したとき、すなわち完全に操作のための現在のスレッドが待機を)お部屋DB機能がブロックされていると仮定すると:

// Create a shared single threaded executor to run both operations on the same background thread
private Executor sharedSingleThreadExecutor = Executors.newSingleThreadExecutor();

private void doThingAThenThingB() {
    // Sequentially call thing A on shared background thread
    sharedSingleThreadExecutor.execute(() -> {    
        // Do thing A
        doThingA();
    });

    // Sequentially call thing B on shared background thread
    sharedSingleThreadExecutor.execute(() -> {
        // Do thing b
        doThingB();
    });
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=277362&siteId=1
おすすめ