web-dev-qa-db-ja.com

Android部屋+ AsyncTask

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

AsyncTaskを正しく使用しているかどうかはわかりません。

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

行を挿入する呼び出しの例:

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

これでDAOに:

@Insert
void insertInstance(MyModel model);
13
NickB

@CommonsWareの回答を完了するには、 Executor クラスを使用して、Roomクエリをバックグラウンドスレッドに実行します。

Executor myExecutor = Executors.newSingleThreadExecutor();
myExecutor.execute(() -> {
   myModelDAO.insertInstance(myModel)
});

Googleは、Android Architecture Components guide

11
Phil

ルームへのすべての通話はバックグラウンドサービスからのものです

次に、AsyncTaskを使用しないでください。 AsyncTask is onlyは、バックグラウンド処理を行った後にメインアプリケーションスレッドで処理を行いたい場合に使用します。これは、サービスの場合はほとんどありません。他のもの(スレッド、スレッドプール、RxJavaなど)を使用します。これはRoomとは関係ありません。

4
CommonsWare

Consumer<List<object>>callbackのようなコールバックを使用できます。例えば:

roomManger.getAllUsertById(user.getId(), this, new Consumer<List<User>>() {
            @Override
            public void accept(List<Product> listOfUser) {
                users.addAll(listOfUser)}
0
Shlomo Kashy
AsyncTask.execute(() -> myModelDAO.insertInstance(myModel));

正しくないように見えますが、単純なスレッド/スレッドプール/スケジューラなどを使用できます

0
Dipendra Sharma