2017-09-29 15 views
0

私のチームは、Roomを幅広く使用する新しいAndroidアプリを開発しました。Android Room + AsyncTask

AsyncTaskを正しく使用しているかどうかは不明です。

AsyncTasksで挿入/更新/削除の呼び出しをすべてラップする必要があり、結果として膨大な数のAsyncTaskが発生しました。ルームへのすべてのコールはバックグラウンドサービスからのものです。アクティビティやフラグメントから直接ルームにアクセスすることはできず、LiveData経由ですべてを取得します。

行を挿入する例のコール:DAOでこれで

AsyncTask.execute(() -> myModelDAO.insertInstance(myModel)); 

を:部屋に

@Insert 
void insertInstance(MyModel model); 

答えて

3

すべてのコールは

そして、バックグラウンドサービスからですAsyncTaskを使用しないでください。 AsyncTaskです。バックグラウンドで作業した後にメインのアプリケーションスレッドで作業したい場合、サービスではほとんどそうではありません。何か他のもの(スレッド、スレッドプール、RxJavaなど)を使用してください。これはルームとは何の関係もありません。

+0

insert queryはアンドロイドのUIスレッドをロックできますが、これは許可されていません。バックグラウンド非同期またはRXの内部に挿入する必要があります –

+0

@MunishThakur:はい、しかし、AsyncTaskを伴わない非同期作業を行う方法はたくさんあります。 – CommonsWare

+0

右、lambaとkotlinのサポートeveythingは短いイベントです。非同期タスクも1つのライナーです:-) AsyncTask.execute({//コードを実行する} –

0
AsyncTask.execute(() -> myModelDAO.insertInstance(myModel)); 

あなたはあなたがConsumer<List<object>>callbackのようなコールバックを使用することができますシンプルなスレッド/スレッドプール/スケジューラなど

0

使用することができます間違ったように見えます。 例:

roomManger.getAllUsertById(user.getId(), this, new Consumer<List<User>>() { 
      @Override 
      public void accept(List<Product> listOfUser) { 
       users.addAll(listOfUser)}