Traitement asynchrone par RxJava (RxAndroid) sur Android

introduction

La dernière fois, j'ai parlé de la création d'un exemple d'application dans l'article suivant. RxJava (RxAndroid) + RxBus + Data Binding + échantillon de salle (basé sur Java 1.7) sur Android.

Cette fois, j'expliquerai l'implémentation qui utilise RxJava pour acquérir des données de manière asynchrone à partir de l'API. Veuillez vous référer à l'article précédent ci-dessus pour l'environnement d'exploitation.

Nécessité d'un traitement asynchrone par application Android

Lorsque vous essayez d'obtenir des données à partir d'une API qui existe sur le Web Le traitement peut prendre un certain temps en fonction de l'état de la communication et de la quantité de données. Pendant ce temps, si les opérations sur l'écran (annulation, etc.) ne sont pas acceptées, l'UX se détériorera, donc Le traitement qui peut prendre du temps est généralement effectué de manière asynchrone.

Bibliothèque pour réaliser des traitements asynchrones

Il existe plusieurs bibliothèques sur Android qui permettent ce processus asynchrone.

J'ai utilisé RxJava cette fois, Vous pouvez envisager d'utiliser d'autres bibliothèques telles que LiveData. Au fait, la raison pour laquelle j'ai choisi RxJava est Je pensais qu'il y avait de nombreux exemples d'utilisation et de nombreux cas, C'est parce que je pensais qu'il était "flétri" par rapport à LiveData.

Conditions préalables

Cette fois, je n'expliquerai pas la programmation réactive ou RxJava. Pour plus de détails, si vous google, vous obtiendrez divers hits, alors là ...

Aussi, pour le moment, seule l'explication minimale nécessaire est donnée pour bouger, donc Lorsque vous l'utilisez à des fins professionnelles, assurez-vous de le vérifier **.

Réalisation et explication des traitements asynchrones par RxJava.

Vous pouvez consulter la source des explications ici.

GitHub SampleAndroidApps

Traitement côté exécution de l'API (Observateur côté surveillé)

La source correspondante est ici

    Observable.create(new ObservableOnSubscribe<GithubRepositoryApiResponseEntity>() {
        @Override
        public void subscribe(ObservableEmitter<GithubRepositoryApiResponseEntity> emitter) throws Exception {
    
            //Traitement asynchrone
            Request request = new Request.Builder()
                    .url(url)
                    .get()
                    .build();
    
            OkHttpClient client = new OkHttpClient();
            try {
                Response res = client.newCall(request).execute();
                String responseBodyStr = res.body().string();
                //Objectize json avec GSON
                Gson gson = new Gson();
                GithubRepositoryApiResponseEntity responceData = (GithubRepositoryApiResponseEntity) gson.fromJson(responseBodyStr, GithubRepositoryApiResponseEntity.class);
                emitter.onNext(responceData);
                emitter.onComplete();
            } catch (Exception e) {
                e.printStackTrace();
                emitter.onError(e);
            } finally {
                loading = false;
            }
        }
    })
    .observeOn(Schedulers.newThread())  //après observer(réponse)Faites-le dans un nouveau fil
    .subscribeOn(Schedulers.newThread())       //Faites-le de manière asynchrone dans un nouveau thread
    .subscribe(observer);             //Exécuter

Passez une classe anonyme de type ObservableOnSubscribe à Observable.create. ObservableOnSubscribe spécifie le type d'objet à diffuser (résultats reçus par Observer). Écrivez le processus que vous souhaitez rendre asynchrone dans la méthode d'abonnement. (Cette fois, le processus consistant à frapper Api pour obtenir le référentiel de GitHub)

Dans emitter.onNext, spécifiez le flux (résultat reçu par Observer). N'oubliez pas d'appeler ʻemitter.onComplete (); . Le système anormal est ʻemitter.onError (Exception); .

Passez le résultat de Observable.create à observeOn et Spécifie le thread à traiter. ʻSi vous spécifiez AndroidSchedulers.mainThread () , il fonctionnera sur le thread principal. Si vous spécifiez Schedulers. newThread ()`, il fonctionnera sur un nouveau thread (qui n'interfère pas avec le thread principal).

Enfin, spécifiez l'observateur dans la méthode subscribe et inscrivez-vous.

Traitement du côté qui a reçu le résultat de l'exécution de l'API (Observateur du côté de la surveillance)

La source correspondante est ici

    private Observer observer = new Observer<GithubRepositoryApiResponseEntity>() {
        GithubRepositoryApiCompleteEventEntity eventResult = new GithubRepositoryApiCompleteEventEntity();
    
        @Override
        public void onSubscribe(Disposable d) {
    
        }
    
        @Override
        public void onNext(GithubRepositoryApiResponseEntity response) {
            eventResult.setResult(false);
    
            List<GithubRepositoryApiResponseEntity.Repository> repositoryList = response.getItems();
            ArrayList<GithubRepositoryListItemEntity> data = new ArrayList<>();
            for (GithubRepositoryApiResponseEntity.Repository repository : repositoryList) {
                GithubRepositoryListItemEntity listItem = new GithubRepositoryListItemEntity();
                listItem.setFullName(repository.getFull_name());
                data.add(listItem);
            }
    
            eventResult.setListItems(data);
            if (response.getItems() != null && response.getItems().size() > 0) {
                eventResult.setResult(true);
            }
    
            //Appeler un événement
            RxBus.getInstance().send(eventResult);
        }
    
        @Override
        public void onError(Throwable e) {
            //Appeler un événement
            RxBus.getInstance().send(eventResult);
        }
    
        @Override
        public void onComplete() {
    
        }
    };

Tout d'abord, j'expliquerai le RxBus suivant la prochaine fois. RxBus.getInstance().send(eventResult);

Définissez d'abord une instance de type Observer . T spécifie le type d'objet provenant d'Observable.

onSubscribe est une méthode qui est exécutée lorsque la préparation des données est terminée. La notification peut être annulée à l'aide de l'argument Jetable (On ne sait pas s'il est significatif de sortir à ce moment ...)

onNext est une méthode qui est exécutée lorsque les données circulent. Cette fois, vous ne recevez le résultat de l'API qu'une seule fois. Dans cet exemple, il est remplacé par la classe Entity pour l'affichage, Je pense qu'il n'est pas nécessaire que Gson et Data Binding puissent être définis comme un ensemble. (Je pensais que ce n'était pas si fatal, alors je l'ai laissé tel quel)

onError est une méthode appelée lorsqu'une erreur se produit. Je ne l'ai pas traité dans cet exemple, donc Faites quelque chose si vous en avez besoin.

onComplete est une méthode qui est exécutée lorsque le flux de données est terminé.

C'était comme ça.

À propos du cycle de vie

ViewModel est persistant (contient une instance dans une sous-classe d'Application), donc En gros, je ne pense pas qu'il y ait d'impact du cycle de vie. Cependant, cela a un effet lorsque la vue (activité et fragment) est impliquée.

en conclusion

C'est pourquoi il s'agissait d'une brève explication du traitement asynchrone par RxJava. Il semble difficile d'utiliser RxJava pour diverses choses. Pour le moment, à partir du code hérité actuel Il semble possible de remplacer le traitement asynchrone.

La prochaine fois, je voudrais expliquer la notification d'événements par RxBus.

Recommended Posts

Traitement asynchrone par RxJava (RxAndroid) sur Android
Remarques sur le traitement des threads Android (java)
RxJava (RxAndroid) + RxBus + Data Binding + échantillon de salle (basé sur Java 1.7) sur Android.
Traitement des threads de l'interface utilisateur asynchrone Android
Traitement asynchrone et intégration d'API Web dans Android Studio
[Android] Notes sur xml
Exécuter le traitement sur Ant
À propos de la troncature de String par le nombre d'octets sur Android