web-dev-qa-db-fra.com

Android Room + AsyncTask

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);
8
NickB

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 .

11
Phil

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.

4
CommonsWare

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)}
0
Shlomo Kashy
AsyncTask.execute(() -> myModelDAO.insertInstance(myModel));

Ressemblant à une erreur, vous pouvez utiliser Thread/Threadpool/Schedulers simple, etc.

0
Dipendra Sharma