Advertisement
  1. Code
  2. Android SDK

Stellen Sie mit Retrofit, RxJava 2 und Kotlin eine Verbindung zu einer API her

by
Read Time:16 minsLanguages:

German (Deutsch) translation by Tatsiana Bochkareva (you can also view the original English article)

Heutzutage ist es für mobile Apps üblich, Daten mithilfe von APIs (Web Application Programming Interfaces) mit Remote-Servern auszutauschen.

Unabhängig davon, ob Sie mithilfe der Gmail-API nach neuen E-Mails suchen, mit der Ticketmaster-API nach Ereignissen in der Umgebung suchen oder den Spotify-Verlauf des Benutzers nutzen, um neue Musik zu empfehlen, bieten APIs (normalerweise REST-APIs) Zugriff auf eine Vielzahl von Informationen, die Sie verwenden können Verwenden Sie in Ihrer App.

Die Kommunikation mit Remote-Servern ist zu einem so wichtigen Bestandteil der modernen mobilen Entwicklung geworden, dass es unzählige Bibliotheken gibt, die Sie beim Tätigen von Netzwerkanrufen unterstützen. Retrofit ist jedoch eine der am häufigsten verwendeten Netzwerkbibliotheken für Android.

In diesem Artikel werde ich Ihnen zeigen, wie Sie mithilfe von Retrofit und der kostenlosen Nomics Cryptocurrency und Bitcoin-API Daten von einer Remote-API abrufen.

Sobald Sie einige Daten abgerufen haben, möchten Sie sie sinnvoll nutzen! In Android bedeutet dies häufig, dass die Daten an den wichtigen Haupt-UI-Thread von Android weitergeleitet werden, der in der Benutzeroberfläche Ihrer App angezeigt werden kann, oder dass die Daten auf irgendeine Weise transformiert werden, z. B. durch Filtern oder Kombinieren. Praktischerweise können Sie alle diese Dinge mit der RxJava-Bibliothek tun, also verwenden wir Retrofit und RxJava nebeneinander in unserem Projekt.

Am Ende dieses Artikels haben Sie eine App erstellt, die mithilfe von Retrofit Daten von einer Remote-API abruft, diese Daten in das Observable-Format von RxJava konvertiert und diese Daten dann mithilfe einer Auswahl von RxJava- und RxAndroid-Operatoren und -Planern bearbeitet.

Was wir bauen werden

Es gibt keinen Mangel an APIs, aber um die Dinge einfach zu halten, verwenden wir die kostenlose Nomics Cryptocurrency & Bitcoin API, um eine Liste der Kryptowährungen und ihrer Marktpreise für den zuletzt aufgezeichneten Handel abzurufen. Ich verwende dann eine RecyclerView, um diese Informationen in unserer App anzuzeigen.

The finished app will display data retrieved from the Nomics Cryptocurrency Bitcoin APIThe finished app will display data retrieved from the Nomics Cryptocurrency Bitcoin APIThe finished app will display data retrieved from the Nomics Cryptocurrency Bitcoin API

Um eine Nachrüstanforderung zu stellen, müssen Sie Folgendes erstellen:

  • Eine Nachrüstklasse. Hier erstellen Sie eine Retrofit-Instanz, fügen einen Konverter hinzu (wir verwenden Gson) und geben dann die Basis-URL an, die Ihre App für alle HTTP-Anforderungen verwenden soll.
  • Eine Datenklasse. Diese Klasse repräsentiert die Antworten für jeden API-Aufruf Ihrer App.
  • Eine API-Schnittstelle. Hier beschreiben Sie jede Nachrüstanforderung, die Sie stellen möchten.

Am Ende dieses Tutorials haben Sie ein Projekt, das ungefähr so aussieht:

The finished project structure will consist of a Retrofit class data class API interface and an adapter to display the UI The finished project structure will consist of a Retrofit class data class API interface and an adapter to display the UI The finished project structure will consist of a Retrofit class data class API interface and an adapter to display the UI

Warum sollte ich RxJava für meine API-Aufrufe verwenden?

RxJava ist eine Open-Source-JVM-kompatible Implementierung der ReactiveX-Bibliothek, mit der Sie mit asynchronen Datenströmen in einem reaktiven Programmierstil arbeiten können, ohne viele Rückrufe schreiben zu müssen.

Die Verwendung von RxJava in Ihren Android-Projekten bietet viele Vorteile, einige der wichtigsten sind jedoch:

  • Vereinfachter Code. Mit RxJava können Sie beschreiben, was Sie erreichen möchten, anstatt eine Liste mit Anweisungen für Ihre Anwendung zu schreiben. Dieser Ansatz führt in der Regel zu einem präziseren, für Menschen lesbaren Code, der einfacher zu warten und weniger fehleranfällig ist.
  • Konsistenz. RxJava mag eine datenorientierte Bibliothek ein, aber die Definition von „Daten“ ist ziemlich weit gefasst und umfasst Dinge wie Variablen, Caches, Eigenschaften und sogar Benutzereingabeereignisse wie Klicks und Wischen. Da RxJava so ziemlich alles als Daten behandelt, bietet es einen konsistenten Workflow, den Sie in Ihrer Anwendung in vielen verschiedenen Szenarien verwenden können.
  • Multithreading leicht gemacht. Moderne mobile Apps müssen Multitasking-fähig sein, aber als Single-Thread-Umgebung ist Android kein natürlicher Multitasker! Android bietet mehrere integrierte Tools zum Erstellen zusätzlicher Threads. Keine dieser Lösungen ist jedoch besonders einfach zu handhaben und kann schnell zu komplexem Code führen, der für Leistungsprobleme wie Speicherlecks anfällig ist. Durch Hinzufügen von RxJava zu Ihrem Projekt erhalten Sie Zugriff auf die Operatoren subscribeOn und observeOn, wodurch das Erstellen und Verwalten zusätzlicher Threads erheblich vereinfacht wird.
  • Komplexe Datentransformationen. RxJava verfügt über eine enorme Sammlung von Operatoren, mit denen Sie die von Ihren RxJava Observables ausgegebenen Daten ändern, filtern, zusammenführen und transformieren können. Wenn Sie einen Operator auf ein Observable anwenden, wird normalerweise ein anderes Observable zurückgegeben. Wenn Sie also nicht den perfekten Operator für Ihr Projekt finden, können Sie Operatoren einfach so lange auf ein Observable anwenden, bis Sie genau die gewünschten Ergebnisse erhalten.

Weitere Informationen zu den Vorteilen der Verwendung von RxJava in Ihren Android-Projekten finden Sie in unserem Artikel Erste Schritte mit RxJava 2.

Authentifizierung mit einem API-Schlüssel

Bei vielen APIs müssen Sie einen eindeutigen API-Schlüssel in Ihre HTTP-Anforderungen aufnehmen. Mit diesen Schlüsseln kann das Unternehmen oder die Person hinter der API die mit Ihrem Projekt verbundenen Anforderungen verfolgen. Dies ist praktisch, um Nutzungsbeschränkungen durchzusetzen oder wenn der Ersteller der API lediglich einen Einblick in die Verwendung der API wünscht.

Wenn Sie die Nomics Cryptocurrency und Bitcoin-API abfragen, müssen Sie einen eindeutigen API-Schlüssel in Ihre Anfrage integrieren. Generieren Sie diesen Schlüssel jetzt:

  • Gehen Sie in Ihrem Webbrowser zur Nomics-Website.
  • Suchen Sie die Schaltfläche Get Free API Key und klicken Sie darauf.
  • Überprüfen Sie die Allgemeinen Geschäftsbedingungen. Wenn Sie fortfahren möchten, füllen Sie das Formular aus.
  • Wählen Sie Vollständige Bestellung. Nach einigen Augenblicken sollten Sie eine E-Mail mit Ihrem eindeutigen API-Schlüssel erhalten.

Erstellen Sie Ihre Anwendung: Hinzufügen von Abhängigkeiten

Erstellen Sie eine neue Android-Anwendung mit den Einstellungen Ihrer Wahl. Wenn Sie jedoch dazu aufgefordert werden, wählen Sie Kotlin-Unterstützung einschließen.

Öffnen Sie als Nächstes Ihre Datei build.gradle und fügen Sie alle Bibliotheken hinzu, die wir in diesem Projekt verwenden werden. Zusätzlich zu Retrofit und RxJava 2.0 benötigen wir Folgendes:

1. RecyclerView

Nach dem Abrufen unserer Daten werden sie mit RecyclerView in einer Liste angezeigt.

2. Gson Converter

In den meisten Fällen wird die Antwort des Servers einem sprachneutralen Format wie JSON zugeordnet, sodass Ihre App die JSON-Daten serialisieren und deserialisieren muss. Standardmäßig kann Retrofit nur HTTP-Körper in den ResponseBody-Typ von OkHttp deserialisieren. Sie können jedoch auch andere Typen unterstützen, indem Sie die Konvertierung an unabhängige Konverter auslagern.

Es gibt eine große Auswahl an Konvertern, aber in diesem Tutorial verwende ich Gson, das JSON in die entsprechenden Java-Objekte konvertiert.

3. Der RxJava-Adapter

Um Schnittstellenmethoden zu erstellen, die RxJava-Typen zurückgeben können, müssen Sie den Retrofit-Adapter für RxJava verwenden.

4. Die RxAndroid-Bibliothek

Die RxAndroid-Bibliothek bietet einige Android-spezifische Bindungen für RxJava, insbesondere AndroidSchedulers.mainThread.

In Android können Sie die Benutzeroberfläche Ihrer App nur über den Haupt-UI-Thread aktualisieren. Wenn Ihre Benutzer Kryptowährungsdaten sehen, müssen Sie irgendwann zum Haupt-UI-Thread wechseln.

Sie können schnell und einfach Code für die Ausführung auf dem Haupt-UI-Thread von Android planen, indem Sie den observeOn-Operator von RxJava in Kombination mit dem AndroidSchedulers.mainThread-Scheduler von RxAndroid verwenden:

Um RxAndroid in Ihrem Projekt verwenden zu können, benötigen Sie die folgende Projektabhängigkeit:

... aber nicht RxKotlin

An dieser Stelle fragen Sie sich möglicherweise, warum wir in Kotlin codieren, aber RxJava verwenden, wenn eine dedizierte RxKotlin-Bibliothek verfügbar ist.

Da Kotlin zu 100% mit Java interoperabel ist, sind die meisten Java-Bibliotheken mit Kotlin kompatibel, und RxJava ist keine Ausnahme! Sie könnten RxJava und RxKotlin in Ihrem Projekt verwenden, aber um die Dinge einfach zu halten, werde ich mich in diesem Tutorial an RxJava halten. Wenn Sie mehr über RxKotlin erfahren möchten, finden Sie in meinem Artikel über Kotlin Reactive Programming With RxJava und RxKotlin viele Informationen.

Fügen Sie die Projektabhängigkeiten hinzu

Nach dem Hinzufügen all dieser Projektabhängigkeiten sollte Ihre build.gradle-Datei ungefähr so aussehen:

Fordern Sie den Zugang zum Internet an

Da unsere App mit einem Remote-Server kommuniziert, benötigt sie die Berechtigung, auf das Internet zuzugreifen. Öffnen Sie das Manifest Ihres Projekts und fügen Sie Folgendes hinzu:

Da android.permission.INTERNET als sichere Berechtigung eingestuft ist, müssen wir sie zur Laufzeit nicht anfordern.

Definieren Sie Ihre HTTP-Endpunkte

Als nächstes müssen wir eine Schnittstelle erstellen, in der wir unsere HTTP-Anforderungen beschreiben:

  • Wählen Sie in der Android Studio-Symbolleiste Datei > Neu > Kotlin-Datei/Klasse.
  • Nennen Sie diese Datei GetData.
  • Öffnen Sie das Dropdown-Menü und wählen Sie Interface.
Create a new interface by selecting File New Kotlin FileClass from Android Studios toolbarCreate a new interface by selecting File New Kotlin FileClass from Android Studios toolbarCreate a new interface by selecting File New Kotlin FileClass from Android Studios toolbar
  • OK klicken.

Jede Anforderung muss mindestens eine HTTP-Anmerkung enthalten, die angibt, wie diese Anforderung behandelt werden soll. Retrofit unterstützt Anmerkungen für alle Standardanforderungstypen. Wir verwenden jedoch nur die @GET-Anmerkung, da wir Daten vom Server abrufen.

Wir müssen auch den Endpunkt beschreiben, bei dem es sich um die URL handelt, von der wir Daten abrufen. In unserer App ist dies https://api.nomics.com/v1/markets/prices, die aus einer Basis-URL (https://api.nomics.com/v1/) und einer relativen URL (Preise) besteht. Wir werden die Basis-URL an anderer Stelle in unserem Projekt definieren, daher müssen wir uns vorerst nur um die relative URL kümmern.

Wenn für die betreffende API kein API-Schlüssel erforderlich ist, sollte die Angabe der Basis- und relativen URL ausreichen. Da für die Nomics-API jedoch ein Schlüssel erforderlich ist, müssen wir diese Informationen in unsere Anfrage einbeziehen.

Dieser Prozess kann zwischen den APIs variieren. Weitere Informationen finden Sie daher immer in der Dokumentation Ihrer API. Halten Sie insbesondere Ausschau nach Abschnitten mit der Bezeichnung Authentifizierung, da hier häufig Anweisungen zu API-Schlüsseln zu finden sind. Die Nomics API-Dokumentation ist ein perfektes Beispiel dafür, da sie einen eigenen Abschnitt zur Authentifizierung enthält, in dem beschrieben wird, wie Sie Ihren Schlüssel im folgenden Format einbinden sollten:

https://api.nomics.com/v1/prices?key=your-api-key-goes-here

Durch die Kombination der @GET-Annotation, der relativen URL und Ihres API-Schlüssels erhalten wir Folgendes:

Ich rufe die API-Daten mit der Funktion getData() von Kotlin ab. Da diese Funktion RxJava Observables ausgeben soll, müssen wir unseren Endpunkt als gültigen RxJava-Typ definieren:

Hier ist die fertige Oberfläche:

Stellen Sie sicher, dass Sie YOUR-API-KEY-HERE durch Ihren eigenen Schlüssel ersetzen!

Erstellen eines Modells mit der Datenklasse von Kotlin

Als Nächstes müssen wir eine Datenklasse erstellen, die die Antwort auf jeden unserer API-Aufrufe darstellt:

  • Wählen Sie in der Android Studio-Symbolleiste Datei > Neu > Kotlin-Datei / Klasse.
  • Nennen Sie diese Klasse RetroCrypto und klicken Sie dann auf OK.
  • Öffnen Sie Ihre neue RetroCrypto-Klasse.

Wenn Sie zuvor Retrofit-Aufrufe mit Java durchgeführt haben, ist Kotlin in diesem Bereich dank Datenklassen viel prägnanter als das entsprechende Java.

In Kotlin ist eine Datenklasse eine Klasse, die ausschließlich für die Speicherung einiger Daten ausgelegt ist. Der Kotlin-Compiler implementiert die erforderlichen Methoden hashCode(), equals() und toString() automatisch, sodass Sie eine Datenmodellklasse in einer einzigen Codezeile erstellen können.

Öffnen Sie Ihre neue RetroCrypto-Datei und fügen Sie Folgendes hinzu:

Aufbau der Retrofit-Instanz

Um Netzwerkanforderungen zu senden, müssen wir die Retrofit.Builder-Klasse verwenden, um eine Retrofit-Instanz zu erstellen, in der wir unseren Endpunkt aufrufen und die Kryptowährungsinformationen abrufen.

Sobald wir unser Retrofit-Objekt erstellt haben, müssen wir:

  • Legen Sie die Basis-URL fest. Bevor Sie die build()-Methode in Retrofit.Builder aufrufen können, müssen Sie mindestens die Basis-URL definiert haben.
  • Legen Sie den Standardkonverter mit der Methode addConverterFactory() fest. Sobald Sie den Gson-Konverter eingerichtet haben, wird die JSON-Antwort automatisch für Sie übersetzt.
  • Wenden Sie den Adapter an. Retrofit wird mit einem Standardadapter zum Call von Anrufinstanzen geliefert. Sie können jedoch einen oder mehrere zusätzliche Adapter anwenden, indem Sie beim Erstellen der Retrofit-Instanz eine Instanz dieses Adapters angeben. Um RxJava neben Retrofit zu verwenden, müssen Sie RxJava2CallAdapterFactory als Aufrufadapter mit .addCallAdapterFactory hinzufügen.

Dies gibt uns Folgendes:

Standardmäßig gibt ein Observable seine Daten in dem Thread aus, in dem das Abonnement deklariert wurde. Dies ist in Android normalerweise der Haupt-UI-Thread. Um die besten Ergebnisse zu erzielen, sollte Ihre App jedoch nur UI-bezogene Arbeiten am UI-Thread ausführen. Daher verwenden wir RxJavas subscribeOn und einen zugehörigen Scheduler, um einen alternativen Thread zu erstellen, in dem Observable ausgeführt werden soll:

Als Nächstes verwenden wir den Operator observeOn sowie den AndroidSchedulers.mainThread Scheduler von RxAndroid, um die Benachrichtigungen des Observable an den Haupt-UI-Thread von Android zu senden und die abgerufenen Daten in der Benutzeroberfläche unserer App anzuzeigen.

Weitere Informationen zum Abonnieren von Observables in Kotlin finden Sie in meinem Beitrag zu Kotlin Reactive Programming With RxJava und RxKotlin.

Im folgenden Snippet verwende ich auch die handleResponse()-Methode, um die Daten zu verarbeiten, die wir nach einem erfolgreichen Netzwerkvorgang erhalten:

Der obige Code gibt ein Disposable zurück. Wenn Sie bereits Erfahrung mit RxJava 1.0 haben, handelt es sich bei Einwegartikeln im Wesentlichen um die Abonnementversion von RxJava 2.0.

Wenn Sie mit einem Einweg- / Abonnement fertig sind, müssen Sie es entsorgen, um Speicherlecks zu vermeiden. Wir können diesen Bereinigungsprozess vereinfachen, indem wir alle unsere Einwegartikel zu einem CompositeDisposable hinzufügen, einem Behälter, der mehrere Einwegartikel aufnehmen kann. Im obigen Code initialisieren wir CompositeDisposable von RxJava und fügen dann jedes Disposable mithilfe der add()-Methode zum CompositeDisposable hinzu.

Dann müssen wir einfach das CompositeDisposable während der onDestroy()-Methode unseres Projekts löschen:

Hier ist die abgeschlossene Klasse:

Anzeigen der Cryptocurrency-API-Daten

Zu diesem Zeitpunkt kann unsere App erfolgreich Daten von der Nomics-API abrufen. Daher besteht unsere letzte Aufgabe darin, diese Daten dem Benutzer über eine RecyclerView anzuzeigen.

Um eine RecyclerView zu implementieren, benötigen wir Folgendes:

  • Ein RecyclerView-Widget.
  • Ein benutzerdefiniertes XML-Layout, mit dem RecyclerView jedes seiner Elemente anzeigen kann.
  • Ein Adapter, der die Daten an Ihre RecyclerView bindet.

Erstellen einer scrollbaren Liste

Beginnen wir mit dem Hinzufügen eines RecyclerView-Widgets zu unserer Datei activity_main.xml:

Nachdem wir unser RecyclerView-Widget haben, müssen wir das Layout für jede Zeile in diesem RecyclerView definieren. Ich werde ein einfaches Layout erstellen, das aus zwei TextViews besteht, in denen der Name und der Preis für jede von der Nomics-API abgerufene Kryptowährung angezeigt werden:

  • Klicken Sie bei gedrückter Ctrl-Taste auf den Ordner res/layout Ihres Projekts.
  • Wählen Sie Neu > Layoutressourcendatei.
  • Benennen Sie diese Datei row_layout und klicken Sie dann auf OK.
Create a row_layoutxml file where well define the layout of each item in our RecylerViewCreate a row_layoutxml file where well define the layout of each item in our RecylerViewCreate a row_layoutxml file where well define the layout of each item in our RecylerView

Öffnen Sie die Datei row_layout.xml und fügen Sie Folgendes hinzu:

Unser RecyclerView verwendet dieses Layout jetzt für jeden Artikel in unserer Liste.

Daten mit Android-Adaptern binden

Der Adapter ist die Komponente, die für die Bindung jedes Elements an eine View in der RecyclerView verantwortlich ist.

Um das zugrunde liegende Datenmodell mit der Benutzeroberfläche Ihrer App zu verbinden, müssen Sie RecyclerView.Adapter erweitern und anschließend Folgendes implementieren:

  • onCreateViewHolder(). Hier geben wir das Layout (R.layout.row_layout) an, das jedes Element in der RecyclerView verwenden soll, und blasen dieses Layout mit LayoutInflater auf.
  • onBindViewHolder(). Wird von RecyclerView aufgerufen, um die Daten an der angegebenen Position anzuzeigen.
  • getItemCount(). Gibt die Anzahl der im Datensatz vorhandenen Elemente zurück.

Wenn Sie mit Views arbeiten, können Sie Ihren Code häufig mithilfe von Kotlin-Android-Erweiterungen vereinfachen. Mit diesen Erweiterungen können Sie direkt auf die View eines Layouts zugreifen, indem Sie sie als "synthetische" Eigenschaften in Ihre Klasse importieren. Beispielsweise können Sie Verweise auf alle Ansichten in Ihrer row_layout-Datei wie folgt importieren:

Zu diesem Zeitpunkt können Sie auf alle Views von row_layout zugreifen, indem Sie nur deren IDs verwenden - und ohne dass eine findViewById() in Sicht ist! Beispielsweise können Sie das Widget text_name folgendermaßen aktualisieren:

In dieser Klasse übergebe ich die Daten auch als ArrayList zusammen mit einem Listener, mit dem ich Benutzereingabeereignisse verarbeite. Um unsere App ein wenig interessanter aussehen zu lassen, definiere ich ein Array von Farben und verwende sie dann als Hintergrund für meine RecyclerView-Elemente.

Erstellen Sie eine neue Kotlin-Klasse mit dem Namen MyAdapter und fügen Sie Folgendes hinzu:

Testen Ihrer Retrofit- und RxJava 2.0-App

Jetzt ist es Zeit, Ihre Bewerbung zu testen! Stellen Sie sicher, dass Sie über eine aktive Internetverbindung verfügen, und installieren Sie Ihre App auf einem Android-Smartphone oder -Tablet oder AVD (Android Virtual Device). Sobald Ihre App gestartet wird, ruft Retrofit alle verfügbaren Daten von der Nomics-API ab und zeigt sie dann als Teil Ihrer RecyclerView an.

The finished user interface complete with data retrieved from a remote API The finished user interface complete with data retrieved from a remote API The finished user interface complete with data retrieved from a remote API

Sie können das abgeschlossene Projekt auch von unserem GitHub-Repo herunterladen.

Abschluss

In diesem Artikel habe ich Ihnen gezeigt, wie Sie mit Retrofit Daten von einer API abrufen, diese Daten in das Observable-Format von RxJava 2.0 konvertieren und dann in einer RecyclerView anzeigen.

Wenn Sie mehr APIs erkunden möchten, finden Sie bei GitHub eine Liste kostenloser öffentlicher APIs. Weitere Informationen zu RxJava finden Sie in unserer Reihe Erste Schritte mit RxJava 2 für Android oder in einem Blick darauf in unserer Kotlin Reactive Programming-Reihe.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.