[JAVA] Essayez de faire un simple rappel

〇Vue d'ensemble

À mesure que l'architecture devient plus complexe dans les applications Android, les classes qui exécutent des informations asynchrones et les classes qui l'utilisent sont séparées. Dans ce cas, il est nécessaire d'enseigner à une autre classe au moment où les données obtenues de manière asynchrone sont acquises, mais c'est assez gênant. C'est pourquoi il existe diverses bibliothèques telles que AsyncTaskLoader, qui est une bibliothèque de support, et des bibliothèques qui gèrent les bus d'événements (EventBus, RxJava, etc.), mais je n'avais pas beaucoup d'informations sur la façon de créer des rappels primitifs à l'aide de l'interface, alors je les ai résumés. ..

〇 Source de l'échantillon

GitHub

〇 Liste des classes

MainActivity ・ Classe principale -Créer des instances de TasksRepository et TasksBackgroundDataSource. -Les fonctions d'affichage de l'affichage sont également incluses ici pour plus de simplicité.

TasksRepository -Une classe qui contient et exploite des données. -Obtention d'une instance de TasksBackgroundDataSource au moment de la génération. -Lancez une demande d'acquisition de données à TasksBackgroundDataSource, ou recevez un rappel et lancez une demande d'affichage à MainActivity.

TasksBackgroundDataSource -Une classe qui apporte des données de manière asynchrone. -L'interface TasksDataSource est implémentée. ・ (Étant donné que l'écriture du processus de transfert de données depuis le réseau complique le processus, configurez simplement un thread séparé et intégrez les données)

TasksDataSource -Une interface qui résume les relations de traitement de l'acquisition de données.

Task -Une classe de données qui gère les valeurs acquises.

〇 Extrait de la partie de rappel

(Note) Répertorié dans l'ordre inverse de la liste de classe ci-dessus pour faciliter la compréhension.

Définir une fonction pour obtenir des données et une fonction appelée comme rappel

TasksDataSource


public interface TasksDataSource {

    //Fonction appelée comme rappel
    interface LoadTasksCallback {
        void onTasksLoaded(List<Task> tasks);
        void onDataNotAvailable();
    }

    //Fonction d'acquisition de données (il n'est pas nécessaire de l'écrire séparément, mais de l'écrire ensemble)
    void getTasks(@NonNull LoadTasksCallback callback);
}

Implémentation de la fonction d'acquisition de données getTasks Après l'avoir obtenu, j'appellerai la fonction de rappel

TasksBackgroundDataSource


public class TasksBackgroundDataSource implements TasksDataSource {

    @Override
    public void getTasks(@NonNull final LoadTasksCallback callback) {

        final Handler handler = new Handler();

        //Lancement du fil
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                 //Demander le traitement du thread principal à l'aide du gestionnaire (pour mettre à jour View)
                 handler.post(new Runnable() {
                     @Override
                     public void run() {

                         //L'acquisition des données
                         //・
                         //・

                         if (tasks.isEmpty()) {
                             //Traitement en l'absence de données
                             callback.onDataNotAvailable();

                         } else {
                             //Traitement lorsqu'il y a des données
                             callback.onTasksLoaded(tasks);
                         }
                     }
                 });

            }
        });
        thread.start();
    }
}

Appelez getTask de TasksBackgroundDataSource, créez une instance de LoadTasksCallback en tant qu'argument, implémentez la fonction que vous souhaitez appeler et transmettez-la.

TasksRepository


        mTasksBackgroundSource.getTasks(new TasksDataSource.LoadTasksCallback() {
            //Traitement appelé après l'acquisition de données (lorsqu'il y a des données)
            @Override
            public void onTasksLoaded(List<Task> tasks) {
                MainActivity.showTextMsg(changeTasksToString(tasks));
            }
            //Traitement appelé après l'acquisition de données (lorsqu'il n'y a pas de données)
            @Override
            public void onDataNotAvailable() {
                Log.w("DEBUG_DATA","TaskRepository onDataNotAvailable");
            }
        });

〇Résumé

Après tout, appelez ça! Je lance juste une instance qui implémente le processus dans la fonction qui acquiert les données, mais la conception pour le réaliser est compliquée. Ceci est basé sur l'exemple MVP de Google, mais là Le présentateur a appelé la getTask du référentiel, et lorsque la getTask de la DataSource a été appelée, le rappel a été appelé dans une chaîne. Au fur et à mesure que le nombre de destinations d'acquisition augmente, cela devient difficile à comprendre, donc après tout, il est préférable d'utiliser la bibliothèque. J'ai essayé de résumer les bases pour le moment.

〇Référence

android/architecture-samples

Recommended Posts

Essayez de faire un simple rappel
Essayez de créer un itérateur qui puisse être vu
[Débutant] Essayez de créer un jeu RPG simple avec Java ①
Faites une langue! (Faire une simple calculatrice ②)
Comment créer un conteneur Java
Comment créer un pilote JDBC
Un exemple simple de rappels en Java
Faites une langue! (Faire une simple calculatrice ①)
Comment créer un écran de démarrage
Comment créer un plug-in Jenkins
Comment faire un projet Maven
Essayez de créer une application client serveur
CompletableFuture Getting Started 2 (Essayez de faire CompletableFuture)
Comment créer un tableau Java
Faisons une application multiplateforme avec JRuby (génération de fichier jar)
Essayez de créer une tuile de dessin en trois dimensions CS à partir de la tuile Institut géographique
Interface Essayez de créer un problème Java TypeScript 7-3
Comment créer un résumé de calendrier Java
Comment créer un robot Discord (Java)
[docker] [nginx] Créer un ALB simple avec nginx
Un débutant Java a essayé de créer une application Web simple à l'aide de Spring Boot
Faire une marge à gauche du TextField
java j'ai essayé de casser un simple bloc
Je l'ai fait en Java pour toujours rendre (a == 1 && a == 2 && a == 3) vrai
Essayez de créer un babillard en Java
Comportement incrémenté Essayez de créer un problème Java TypeScript 3-4
Je voulais que (a == 1 && a == 2 && a == 3) vrai en Java
Opération de chaîne de caractères Essayez de changer le problème Java en TypeScript 9-3
Comment créer un JRE léger pour la distribution
J'ai essayé de faire un jeu simple avec Javafx ① "Trouvons le jeu du bonheur" (inachevé)
Essayez de faire un rapport chronologique du temps d'exécution d'une méthode à l'aide de l'API JFR
Essayez de libérer la gemme
Initialisation de for Essayez de changer le problème Java en TypeScript 5-4
Comment faire fonctionner JavaScript sur une page spécifique
[Mémo personnel] Créez une copie complète simple avec Java
Essayez de faire un programme d'addition en plusieurs langues
Faisons un robot! "Une simple démo de Java AWT Robot"
J'ai essayé de créer une fonction de connexion avec Java
Comment faire un pot ombré
Créer un utilitaire de réflexion ②
Créer un utilitaire de réflexion ③
Essayez de résoudre un problème FizzBuzz restreint en Java
Comment faire un cache sans trop réfléchir
Créer un utilitaire de réflexion ①
Comment faire un MOD pour Slay the Spire
Essayez de créer un environnement de développement Java à l'aide de Docker
Essayez d'envoyer une notification.
[Introduction au développement d'applications Android] Faisons un compteur
Remarques à vérifier lorsque vous essayez d'utiliser Lombok
[JavaFX] Essayez de créer un clavier MIDI logiciel Partie 2 Faites glisser votre doigt pour changer l'échelle
Comment déployer une application Java Servlet simple sur Heroku
Je souhaite créer un modèle spécifique d'ActiveRecord ReadOnly
Je veux faire une liste avec kotlin et java!
Je voulais juste créer une propriété réactive en Java
Je veux créer une fonction avec kotlin et java!
Créez un CRUD simple avec SpringBoot + JPA + Thymeleaf ① ~ Hello World ~
Apprendre Ruby avec AtCoder 13 Comment créer un tableau à deux dimensions