Greifen Sie mit Get on Android auf die Web-API zu und verarbeiten Sie Json (vorerst Java).

Android bietet verschiedene Optionen für die HTTP-Kommunikation und die JSON-Verarbeitung, sodass es für Benutzer, die es gelegentlich verwenden, schwierig ist. .. .. OkHttp scheint heutzutage sehr beliebt zu sein, also werde ich es versuchen.

Annahme

Spezifikation

Wenn Sie die Taste drücken, möchten Sie vorerst die Web-API starten, um Json abzurufen, zu analysieren und anzuzeigen.

Installieren Sie das Programm, das den folgenden Json auf dem Server zurückgibt.

{"status":"OK","message":"Hello2019-05-31 07:06:23"}

Das Bild unten.

スクリーンショット 2019-05-31 7.08.57.png

Vorbereitung

Bereiten Sie einige vor der Implementierung vor.

Internetzugang zulassen

Fügen Sie der AndroidManifest.xml Folgendes hinzu. Es ist natürlich, aber manchmal ist es zu natürlich, um es zu vergessen.

<uses-permission android:name="android.permission.INTERNET" />

Kommunikationsdomänenberechtigung (nicht https)

Anscheinend führt eine andere Kommunikation als https von Android 9.x zu einem Fehler. Ich erhalte den folgenden Fehler.

java.io.IOException: Cleartext HTTP traffic to hoge.com not permitted

hoge.com ist die Domain oder Subdomain, auf die Sie zugreifen möchten.

Eine Konfigurationsdatei ist erforderlich, um dies zu ermöglichen. Es ist mühsam, aber es entspricht.

Installation der Einstellungsdatei

Erleichtern Sie eine XML-Datei mit dem folgenden Inhalt. Es scheint, dass der Dateiname und der Speicherort überall sein können (da dies im nächsten Prozess explizit angegeben wird).

app/res/xml/network_security_config.xml


<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">www.bluecode.jp</domain>
    </domain-config>
</network-security-config>

Festlegen der Einstellungsdatei

Geben Sie die angegebene Konfigurationsdatei in AndroidManifest.xml an.

AndroidManifest.xml


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="jp.bluecode.http01">

    <application
+       android:networkSecurityConfig="@xml/network_security_config"
        android:allowBackup="true"
        ...

OkHttp-Einstellungen

Zum Grandle-Modul hinzufügen: App und Synchronisierung.

...
dependencies {
    ...
    implementation 'com.squareup.okhttp3:okhttp:4.0.0-alpha02'
}
...

Das ist alles zur Vorbereitung.

Implementierung

Endlich umgesetzt. Kommunikationsverarbeitung etc. kann im Haupt-Thread nicht lange durchgeführt werden. Es ist allgemein bekannt, dass es in einem separaten Thread gestartet und asynchron verarbeitet wird. OkHttp scheint wie folgt beschrieben zu werden.

MainActivity.java

MainActivity.java


package jp.bluecode.http01;

import android.os.Handler;
import android.os.Looper;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import org.jetbrains.annotations.NotNull;
import org.json.JSONObject;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class MainActivity extends AppCompatActivity {

    //Widget-Deklaration
    TextView txt01;
    Button btn01;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //Widget-Initialisierung
        txt01 = findViewById(R.id.txt01);
        btn01 = findViewById(R.id.btn01);

        //Klicken Sie auf die Schaltfläche
        btn01.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                //http Anfrage
                try{
                    //Benutzerdefinierte Funktion mit okhttp (unten)
                    httpRequest("http://www.bluecode.jp/test/api.php");
                }catch(Exception e){
                    Log.e("Hoge",e.getMessage());
                }

            }
        });
    }

    void httpRequest(String url) throws IOException{

        //OkHttpClinet-Generierung
        OkHttpClient client = new OkHttpClient();

        //Anforderungsgenerierung
        Request request = new Request.Builder()
                .url(url)
                .build();

        //Asynchrone Anfrage
        client.newCall(request)
                .enqueue(new Callback() {

                    //Im Fehlerfall
                    @Override
                    public void onFailure(@NotNull Call call, @NotNull IOException e) {
                        Log.e("Hoge",e.getMessage());
                    }

                    //Wenn normal
                    @Override
                    public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {

                        //Antwortabruf
                        final String jsonStr = response.body().string();
                        Log.d("Hoge","jsonStr=" + jsonStr);

                        //JSON-Verarbeitung
                        try{
                            //json Perspektive
                            JSONObject json = new JSONObject(jsonStr);
                            final String status = json.getString("status");

                            //Aktualisierung der Benutzeroberfläche des übergeordneten Threads
                            Handler mainHandler = new Handler(Looper.getMainLooper());
                            mainHandler.post(new Runnable() {
                                @Override
                                public void run() {
                                    txt01.setText(status);
                                }
                            });


                        }catch(Exception e){
                            Log.e("Hoge",e.getMessage());
                        }

                    }
                });
    }
}

activity_main.xml

Ich bin der Meinung, dass Sie das Layout nach Belieben implementieren können, jedoch nur als Referenz.

activity_main.xml


<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/txt01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="200dp"
        android:text="Hello World!"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btn01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:text="Button"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/txt01" />

</android.support.constraint.ConstraintLayout>

Referenz

Recommended Posts

Greifen Sie mit Get on Android auf die Web-API zu und verarbeiten Sie Json (vorerst Java).
[Erstes Java] Machen Sie etwas, das vorerst mit Intellij funktioniert
Verwenden Sie vorerst eine externe Java-Bibliothek
Führen Sie jetzt Dataflow, Java, Streaming aus
[Java] Abrufen und Anzeigen des Datums 10 Tage später mithilfe der von Java 8 hinzugefügten Zeit-API.
Eindrücke und Zweifel an der erstmaligen Verwendung von Java in Android Studio
[Deep Learning von Grund auf neu] in Java 1. Zur Zeit Differenzierung und teilweise Differenzierung
Zum ersten Mal lernen Java # 3 Ausdrücke und Operatoren
Bereiten Sie die Umgebung für Java11 und JavaFx mit Ubuntu 18.4 vor
Behandeln Sie die Java 8-Datums- und Uhrzeit-API mit Thymeleaf mit Spring Boot
Hallo Welt mit Ruby-Erweiterungsbibliothek vorerst
Jetzt ist es an der Zeit, mit der Stream-API zu beginnen
[Memo] Führen Sie Node.js v4.4.5 vorerst unter CentOS 4.9 / RHEL4 (i386) aus (gcc-4.8 und glibc2.11 unter LinuxKernel 2.6.9).
Java14 kam heraus, also habe ich vorerst versucht aufzunehmen
Installieren Sie das memcached Plugin unter MySQL und greifen Sie von Java aus zu
Holen Sie sich die Beschleunigung und Ausrichtung des Weltkoordinatensystems auf Android
[Android] Holen Sie sich das Datum von Montag
Aufbau eines DLNA-Servers unter Ubuntu (vorerst nur verschieben)
Java12 kam heraus, also habe ich vorerst den Schalterausdruck ausprobiert
Warten Sie, bis PostgreSQL mit Docker gestartet ist, und starten Sie dann den WEB-Dienst
Anfänger erstellen Web-Apps mit Java und MySQL (jederzeit hinzufügen)
Aktivitätsübergang mit JAVA-Klassen-Refactoring und Instanz-Experimentieren auf Android-Seite
Android-Entwicklung - WEB-Zugriff (GET) Versuchen Sie, Daten durch Kommunikation mit der Außenwelt abzurufen. ~
Erstellen einer App und erstmaliges Bereitstellen mit heroku
Einführung in Java zum ersten Mal # 2
[Java 7] Teilen Sie die Java-Liste und führen Sie den Prozess aus
Zum ersten Mal Java lernen [Einführung]
[Java8] Durchsuchen Sie das Verzeichnis und holen Sie sich die Datei
[Java] Ermitteln Sie das Datum mit der LocalDateTime-Klasse
Android Development-WEB Access (POST) Versuchen Sie, mit der Außenwelt zu kommunizieren und Daten zu senden. ~
Überwachen Sie den Docker-Container und den SystemD-Prozess auf demselben Host mit Zabbix unter Ubuntu.
Ich möchte, dass Sie Scala vorerst als besseres Java verwenden
Betreten Sie Docker-Compose vorerst und lernen Sie Docker, während Sie das grundlegende Design des Webservers (Nginx) lernen
Überprüfen Sie die für den laufenden Java-Prozess festgelegten Optionen
[Android] Ermittelt die getippte Position (Koordinaten) auf dem Bildschirm
ChatWork4j für die Verwendung der ChatWork-API in Java
[Java] Stellen Sie die Zeit im Browser mit jsoup ein
JSON mit Java und Jackson Teil 2 XSS-Maßnahmen
Android Studio-Entwicklung zum ersten Mal (für Anfänger)
[Java] Holen Sie sich Bilder mit der Google Custom Search API
Installieren Sie vorerst Amazon Corretto (Vorschau)
Kompilieren Sie Java und führen Sie es in der Befehlszeile aus
Docker Container Operations mit Docker-Client API für Java
[Android-Entwicklung] Holen Sie sich mit Java Bilder vom Server und legen Sie sie in ImageView fest! !!
Zurück zum Anfang und erste Schritte mit Java ① Datentypen und Zugriffsmodifikatoren
Vorläufiges Memo beim Erstellen der CentOS 6-Serie mit VirtualBox
Träumen Sie davon, einfach eine Web-API für die Datenbank eines vorhandenen Java-Systems zu erstellen
[Android Studio / Java] Was Sie nicht verstehen, wenn Sie es zum ersten Mal berühren