[JAVA] So interagieren Sie mit einem Server, der die App nicht zum Absturz bringt

Einführung

Beim Erstellen einer nativen App auf Android oder iOS denke ich, dass sie die meiste Zeit über eine API mit einer Art Server kommuniziert. Wenn Sie jedoch nicht gut mit den API-Daten umgehen, Es stürzt ab oder soll eine instabile App sein, die seltsam funktioniert. Dieses Mal werden wir die bisher aufgetretenen Abstürze / Fehlfunktionen zusammenfassen und Maßnahmen einführen, um ein Abstürzen zu verhindern.

Lehren aus den aufgetretenen Fehlern

Stellen Sie sicher, dass Sie die Verarbeitung im Falle eines Serverfehlers / Analysefehlers schreiben

Absturz

Kommentar

Der Server gibt nicht immer 200 zurück (normales System). Wenn Sie eine betrügerische Anfrage senden, wird 404 oder 422 zurückgegeben. Wenn auf den Server zu viel zugegriffen wird und er nicht verfügbar ist, wird ein Fehler zurückgegeben. Es gibt nichts zurück und kann eine Zeitüberschreitung verursachen.

Wenn zu diesem Zeitpunkt die Überlegung, was zu tun ist, wenn ein Fehlerwert zurückgegeben wird, weggelassen wird, kann dies aufgrund eines Analysefehlers fallen, oder verschiedene Werte können sich im Zustand Null oder Anfangswert bewegen, was zu einem abnormalen Betrieb führt.

Gegenmaßnahmen

Stellen Sie sicher, dass Sie die Fehlerbehandlung hinzufügen, wenn ein Fehler der Serie 400 oder 500 zurückgegeben wird. Wenn das Parsen fehlschlägt, wird es als Fehler behandelt und der Benutzer wird benachrichtigt, dass ein Kommunikationsfehler vorliegt.

Ich glaube nicht, dass "der Wert von XX immer auf dem Server ist"

Absturz

Kommentar

Bei der Festlegung der Spezifikationen mit dem Entwickler auf der Serverseite Möglicherweise wird Ihnen mitgeteilt: "Dieser Wert ist nicht vorhanden, wenn er null ist. Sie müssen also nicht nach null suchen." Glaube diesen Worten nicht. Die Person hat nicht immer einen vollständigen Überblick über die Datenspezifikationen. ** Möglicherweise repariert nicht das Teil das Teil später **

Gegenmaßnahmen

Angenommen, alle Antworten sind nullwertfähig

Da wir nicht wissen, wann null zurückgegeben wird, sollten alle Datenklassen, die die Antwort erhalten, Nullable und String sein.

UserApiData.kt


data class UserApiData(
  val id : String?,
  val name : String?,
  val age : String?,
  val birthDay : String?
)

(Geschrieben in Kotlin)

Wenn Sie dies jedoch tun, müssen Sie jedes Mal, wenn Sie es in der Anwendung verwenden, eine Nullprüfung und eine Typkonvertierung durchführen, und der Code wird sehr kompliziert. aus diesem Grund, ① Datenklasse, die die Antwort empfängt ② In der App verwendete Datenklasse Erstellen Sie zwei und erstellen Sie eine Konvertierungsmethode, die ① zu ② erstellt.

User.kt


data class User(
  val id : String,
  val name : String,
  val age : Int,
  val birthDay : Date
)

UserConverter.kt


class UserConverter(){
    fun convert(data: UserApiData): User {
        if (data.id == null) throw IllegalArgumentException("user_id is null")
        return User(
                data.id,
                data.name ?: "",
                data.age?.toIntOrNull() ?: 0,
                parseData(data.birthDay)
        )
    }
}

Bei dieser Konvertierungsmethode wird eine Nullprüfung durchgeführt und der Wert in Form von NonNull eingegeben. Wenn Sie in der Null stecken bleiben, überprüfen Sie dort

  1. Geben Sie den Standardwert für den Anzeigewert ein
  2. Da sich die ID auf die nachfolgende Verarbeitung auswirkt, lösen Sie eine Ausnahme aus und zeigen Sie einen Fehlerdialog an.

Je nach Fall verwenden wir die Korrespondenz wie. Anschließend können Sie ** an einer Stelle eine Nullprüfung durchführen, während Sie die Antwort vom Server ordnungsgemäß empfangen **.

Int = 0, boolean = false haben keine Bedeutung

Fehlfunktion

Kommentar

Dies führt zu einem Fehler beim Definieren von Anforderungen. In Java werden int und boolean zunächst auf 0 bzw. false gesetzt und sind nicht null. Es wird unter der Annahme implementiert, dass ein anderer Wert als 0 von api stammt. Wenn der Wert nicht kommt, wird der Prozess so wie er ist mit 0 ausgeführt.

Gegenmaßnahmen

Sie können es wie ↑ auf String setzen oder es mit der Wrapper-Klasse Int, Boolean anstelle des primitiven Typs int, boolean empfangen.

Wenn Sie dies tun, ist der Anfangswert null. Wenn sich der Anfangswert also nicht unbeabsichtigt ändert, tritt anstelle einer unzulässigen Operation ein Absturz oder Fehler auf.

Ich möchte auch Abstürze / Fehler verhindern, aber dies ist immer noch besser, da es in Crashlytics enthalten ist und beim Testen leichter zu erkennen ist.

Zusammenfassung

Eigentlich gibt es einige Maßnahmen, die nicht durch Anpassen der Montagezeit und der Spezifikationen ergriffen werden können, aber ich denke, es wäre gut, wenn wir so viele Maßnahmen wie möglich ergreifen könnten, um eine stabile App zu erstellen.

Recommended Posts

So interagieren Sie mit einem Server, der die App nicht zum Absturz bringt
So lösen Sie das Problem, dass Aptana Studio nicht gestartet wird
So überprüfen Sie, bevor Sie mit Spring Integration eine Nachricht an den Server senden
[Fehler] So beheben Sie das Phänomen, dass der Bildschirm nach der Bearbeitung nicht wechselt
So führen Sie die SpringBoot-App als Dienst aus
Organisierte schrittweise Interaktion mit dem JDK
So machen Sie einen Screenshot mit dem Android Studio-Emulator
So erhalten Sie das Protokoll, wenn install4j nicht gestartet wird
So stellen Sie eine App bereit, die ein lokales Glas auf Heroku verweist
So identifizieren Sie den Pfad, auf dem leicht Fehler gemacht werden können
Wie gehe ich mit dem Typ um, den ich 2 Jahre lang über das Schreiben eines Java-Programms nachgedacht habe?
Eine eigenständige Java-App, die Protokolle mit slf4j / logback an CloudWatch-Protokolle sendet
[Persönliches Memo] Interaktion mit dem Zufallszahlengenerator in Java
Server mit Spring Gradle ausführbar So erstellen Sie JAR und WAR
[Rails] So wenden Sie das in der Hauptanwendung verwendete CSS mit Administrate an
So erstellen Sie eine App mit einem Plug-In-Mechanismus [C # und Java]
So funktioniert @Transactional, das nicht funktioniert, wenn Sie es falsch verwenden
So erhalten Sie die ID eines Benutzers, der sich in Swift bei Firebase authentifiziert hat
So stellen Sie ein mit Java erstelltes System (Wicket-Spring-Boot) auf dem Campus-Server bereit
So erstellen Sie eine Klasse, die Klasseninformationen erbt
SSH-Login beim App-Server mit Heroku
Eine Geschichte, die unter einem Raum litt, der nicht verschwindet, selbst wenn er mit Java beschnitten ist
Was zu tun ist, wenn es ungültig ist, weil es nicht mit einem '-' beginnt
So testen Sie eine Klasse, die application.properties mit SpringBoot verarbeitet (Anfrage: darauf hingewiesen)
So erstellen Sie einen Jenkins-Server mit einem Docker-Container unter CentOS 7 von VirtualBox und greifen von einem lokalen PC auf den Jenkins-Server zu
So stellen Sie VSCode Remote Containers in einem Docker-Compose-Projekt bereit, das sowohl die API als auch die Front-App enthält
[Swift] Eine einfache Art, Entlassung zu beschreiben, die im Einführungsbuch nicht gelehrt wurde
MockMVC gibt 200 zurück, auch wenn ich eine Anfrage an einen Pfad stelle, der nicht existiert
Speichern von Dateien mit der angegebenen Erweiterung unter dem in Java angegebenen Verzeichnis in der Liste
[Docker] So sehen Sie den Inhalt von Volumes. Starten Sie einen Container mit Root-Rechten.
Was tun, wenn die Annotation JSON Hint nicht mit Lombok und JSONIC funktioniert?
So löschen Sie untergeordnete Elemente, die gleichzeitig einem übergeordneten Element zugeordnet sind
Umgang mit Fehlern in Rails s konnte keine JavaScript-Laufzeit finden.
So ändern Sie die Aktion mit mehreren Senden-Schaltflächen
So pushen Sie mit Rails entwickelte Apps an Github
So löschen Sie ein mit Rails erstelltes new_record-Objekt
So generieren Sie manuell ein JWT mit Knock in Rails
Ich möchte den Dunkelmodus mit der SWT-App verwenden
[So fügen Sie ein Video mit Rails in haml ein]
HTTPS-Verbindung mit Java zum selbstsignierten Zertifikatsserver
Süchtig nach dem Webpacker, der standardmäßig mit Rails 6 geliefert wird
Wie erstelle ich einen MOD für Slay the Spire?
[Java] So unterbrechen Sie eine Zeile mit StringBuilder
[Java] Umgang mit der Situation, in der das Programm, das in den Output Stream of Process schreibt, nicht endet, selbst wenn waitFor
Die Geschichte, die zur Lösung des Fehlers führte, weil postgres nicht mit Docker-Compose begann
[Fehlerbehebung] Behebung, wenn der Fehler "JavaScript-Laufzeit konnte nicht gefunden werden" nach dem Upgrade von Catalina angezeigt wird!
Was tun, wenn Sie Ruby mit rbenv installiert haben, die Version sich jedoch nicht ändert?
So laden Sie eine Bibliothek aus einer JAR-Datei mit VSCode << So verwenden Sie Maven / Gradle nicht >>
Notiz, die zum Anmeldebildschirm übergeht, wenn Sie nicht mit devise angemeldet sind
So reduzieren Sie die Programmlast ein wenig, wenn Sie Zeichen mit JAVA kombinieren
So fordern Sie mit jMeter eine CSV-Datei als JSON an