Wenn die Architektur in Android-Apps komplexer wird, werden die Klassen, die asynchrone Informationen ausführen, und die Klassen, die sie verwenden, getrennt. In diesem Fall ist es notwendig, eine andere Klasse zu dem Zeitpunkt zu unterrichten, zu dem die asynchron erhaltenen Daten erfasst werden, aber es ist ziemlich mühsam. Aus diesem Grund gibt es verschiedene Bibliotheken wie AsyncTaskLoader, eine Unterstützungsbibliothek, und Bibliotheken, die Ereignisbusse (EventBus, RxJava usw.) verarbeiten. Ich hatte jedoch nicht viele Informationen zum Erstellen primitiver Rückrufe über die Schnittstelle und habe sie daher zusammengefasst. ..
MainActivity · Hauptklasse -Erstellen Sie Instanzen von TasksRepository und TasksBackgroundDataSource.
TasksRepository
TasksBackgroundDataSource
TasksDataSource -Eine Schnittstelle, die die Verarbeitungsbeziehungen der Datenerfassung zusammenfasst.
Task
(Hinweis) Zum besseren Verständnis in umgekehrter Reihenfolge wie in der obigen Klassenliste aufgeführt.
Definieren Sie eine Funktion zum Abrufen von Daten und eine Funktion, die als Rückruf aufgerufen wird
TasksDataSource
public interface TasksDataSource {
//Funktion als Rückruf aufgerufen
interface LoadTasksCallback {
void onTasksLoaded(List<Task> tasks);
void onDataNotAvailable();
}
//Datenerfassungsfunktion (Es ist nicht erforderlich, sie separat zu schreiben, sondern zusammen zu schreiben)
void getTasks(@NonNull LoadTasksCallback callback);
}
Implementierte Datenerfassungsfunktion getTasks Nachdem ich es bekommen habe, werde ich die Rückruffunktion aufrufen
TasksBackgroundDataSource
public class TasksBackgroundDataSource implements TasksDataSource {
@Override
public void getTasks(@NonNull final LoadTasksCallback callback) {
final Handler handler = new Handler();
//Thread-Start
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
//Anforderungsverarbeitung vom Hauptthread mit Handler (zum Aktualisieren der Ansicht)
handler.post(new Runnable() {
@Override
public void run() {
//Datenerfassung
//・
//・
if (tasks.isEmpty()) {
//Verarbeitung, wenn keine Daten vorhanden sind
callback.onDataNotAvailable();
} else {
//Verarbeitung bei Daten
callback.onTasksLoaded(tasks);
}
}
});
}
});
thread.start();
}
}
Rufen Sie getTask von TasksBackgroundDataSource auf, erstellen Sie eine Instanz von LoadTasksCallback als Argument, implementieren Sie die aufzurufende Funktion und übergeben Sie sie.
TasksRepository
mTasksBackgroundSource.getTasks(new TasksDataSource.LoadTasksCallback() {
//Verarbeitung nach Datenerfassung aufgerufen (wenn Daten vorhanden sind)
@Override
public void onTasksLoaded(List<Task> tasks) {
MainActivity.showTextMsg(changeTasksToString(tasks));
}
//Verarbeitung nach Datenerfassung aufgerufen (wenn keine Daten vorhanden sind)
@Override
public void onDataNotAvailable() {
Log.w("DEBUG_DATA","TaskRepository onDataNotAvailable");
}
});
Nennen Sie das doch! Ich werfe nur eine Instanz, die den Prozess in der Funktion implementiert, die die Daten erfasst, aber das Design, um sie zu realisieren, ist kompliziert. Ich habe dies basierend auf Googles MVP-Beispiel gemacht, aber dort Der Präsentator hat die getTask des Repositorys aufgerufen, und als die getTask der DataSource aufgerufen wurde, wurde der Rückruf in einer Zeichenfolge aufgerufen. Wenn die Anzahl der Erfassungsziele zunimmt, wird es schwierig zu verstehen, daher ist es besser, die Bibliothek zu verwenden. Ich habe vorerst versucht, die Grundlagen zusammenzufassen.
Recommended Posts