À 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. ..
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.
(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");
}
});
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.
Recommended Posts