Mon équipe a développé une nouvelle application Android qui utilise intensivement Room.
Je ne sais pas si nous utilisons correctement AsyncTask.
Nous avons dû encapsuler tous les appels d'insertion/de mise à jour/de suppression dans AsyncTasks, ce qui entraîne un nombre considérable de tâches Async. Tous les appels en salle proviennent de services d'arrière-plan. Il n’ya pas d’accès direct à la salle à partir d’activités ou de fragments - ils obtiennent tout via LiveData.
Un exemple d'appel pour insérer une ligne:
AsyncTask.execute(() -> myModelDAO.insertInstance(myModel));
Avec ceci dans le DAO:
@Insert
void insertInstance(MyModel model);
Pour compléter la réponse @CommonsWare, vous pouvez utiliser la classe Executor pour exécuter des requêtes de salle dans un fil d’arrière-plan.
Executor myExecutor = Executors.newSingleThreadExecutor();
myExecutor.execute(() -> {
myModelDAO.insertInstance(myModel)
});
Google a montré un exemple sur ses composants d'architecture Android guide .
Tous les appels en salle proviennent de services d'arrière-plan
Alors vous ne devriez pas utiliser AsyncTask
. AsyncTask
est seulement lorsque vous voulez travailler sur le thread principal de l'application après avoir effectué du travail en arrière-plan, ce qui n'est presque jamais le cas avec un service. Utilisez autre chose (thread, pool de threads, RxJava, etc.). Cela n'a rien à voir avec Room.
Vous pouvez utiliser un rappel comme Consumer<List<object>>callback
. Par exemple:
roomManger.getAllUsertById(user.getId(), this, new Consumer<List<User>>() {
@Override
public void accept(List<Product> listOfUser) {
users.addAll(listOfUser)}
AsyncTask.execute(() -> myModelDAO.insertInstance(myModel));
Ressemblant à une erreur, vous pouvez utiliser Thread/Threadpool/Schedulers simple, etc.