[JAVA] Ich habe eine Android-App erstellt, die mit HTTP abgerufen wird

Ich bin ein Anfänger in der Entwicklung von Android-Anwendungen, der neulich diesen Artikel geschrieben hat. Notieren Sie sich, was Sie heute gelernt haben.

Hinweis

Dieser Artikel wurde von Anfängern geschrieben, um zu notieren, was sie gelernt haben. Es besteht eine hohe Wahrscheinlichkeit, dass es von der Art der Implementierung oder dem gesunden Menschenverstand abweicht. Seien Sie also vorsichtig, wenn Sie es als Referenz für die Implementierung verwenden, oder Sie sollten auf eigenes Risiko aufhören.

Was ich heute gelernt habe

-Es scheint besser zu sein, HttpUrlConnection zu verwenden, um jetzt HTTP / GET-Anforderungen von Android-Apps zu senden-> Referenz )

-HTTP-Kommunikation muss in Android-Apps asynchron implementiert werden. Es ist erforderlich, mit einem anderen Thread als dem Thread zu kommunizieren, in dem die Anwendung selbst ausgeführt wird.

・ Es ist der Haupt-Thread, der mit der Benutzeroberfläche der App in Konflikt gerät, und der Haupt-Thread kann nicht von einem anderen Thread manipuliert werden (die Benutzeroberfläche kann nicht manipuliert werden) -> Es gibt ein Gerät

Ich stolpere auf verschiedene Arten, aber lerne, während ich Schritt für Schritt codiere!

Was dieser Artikel nicht erklärt

Das Ziel, um die Anfrage dieses Mal zu senden, ist PHP, das von mir auf dem von mir erstellten Server implementiert wurde, und es ist ein Programm, das das Ergebnis mit json für eine entsprechende GET-Anfrage entsprechend zurückgibt. Dieser Artikel geht weder darauf ein, noch beschreibt er seine Implementierung. Lassen Sie es uns separat schreiben.

Was ich heute gemacht habe

Stellen Sie mit einer solchen Benutzeroberfläche eine Anforderung mit GET an den im oberen editText eingegebenen URI, und schreiben Sie den Antworttext in den unteren editText, wenn das Ergebnis erhalten wird.

1.png

"URL anfordern" ist nur eine Textansicht. Einfach gesagt. Ich habe diesen Artikel jetzt geschrieben, aber dies ist keine URL, sondern eine URI, aber es spielt keine Rolle, welche

Die Lücke zwischen dieser und der als GET geschriebenen Schaltfläche ist editTextUrl. Ich werde versuchen, eine GET-Anfrage für diese URL (URI) zu stellen. Die GET-Taste ist nur eine Taste. Führen Sie die Methode mit onClick aus. Darunter ist editTextResponse ein Leerzeichen, um das von der Anforderung erhaltene Ergebnis anzuzeigen. Lassen Sie uns das nächste Mal einen Header getrennt vom Antworttext ausgeben. Insgeheim befindet sich unten eine kleine textViewTime. Messen Sie die Zeit, die zum Abrufen der Anforderung benötigt wurde, und versuchen Sie, sie auszugeben.

Also habe ich den folgenden Code geschrieben.

MainActivity.java


package com.example.hogehogehoge.testapp11;

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

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class MainActivity extends AppCompatActivity {

    TextView textViewUrl;
    EditText editTextUrl;
    Button buttonGet;
    EditText editTextResponse;
    TextView textViewTime;
    long startTime;
    long endTime;

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

        textViewUrl = (TextView)findViewById(R.id.textViewUrl);
        textViewTime = (TextView)findViewById(R.id.textViewTime);
        editTextUrl = (EditText)findViewById(R.id.editTextUrl);
        buttonGet = (Button)findViewById(R.id.buttonGet);
        textViewTime = (TextView)findViewById(R.id.textViewTime);
        editTextResponse = (EditText)findViewById(R.id.editTextResponse);

        editTextUrl.setText("http://Mein Testserver/get.php?target=test");
    }

    //Zum Überprüfen der Funktion der Schaltfläche klicken
    public void onButtonGetTest(View view) {
        Toast.makeText(this,"click test",Toast.LENGTH_SHORT).show();
    }

    public void onButtonGet(View view) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    URL url = new URL(editTextUrl.getText().toString());
                    //Startzeit der Verarbeitung
                    startTime = System.currentTimeMillis();
                    HttpURLConnection con = (HttpURLConnection)url.openConnection();
                    final String str = InputStreamToString(con.getInputStream());
                    //Endzeit verarbeiten
                    endTime = System.currentTimeMillis();
                    Log.d("HTTP", str);

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            editTextResponse.setText(String.valueOf(str));
                            textViewTime.setText("Verarbeitungszeit:" + (endTime - startTime) + "ms");
                        }
                    });
                } catch (Exception ex) {
                    System.out.println(ex);
                }
            }
        }).start();
    }

    // InputStream -> String
    static String InputStreamToString(InputStream is) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = br.readLine()) != null) {
            sb.append(line);
        }
        br.close();
        return sb.toString();
    }
}

Referenz

HTTP-Kommunikation (GET-Anforderung) unter Android Bedienen Sie die Benutzeroberfläche des Hauptthreads der Anwendung von einem anderen Thread aus

Kommentar

Wenn die App gestartet wird, wird onCreate ausgeführt und darin


editTextUrl.setText("http://Mein Testserver/get.php?target=test");

Wird ausgeführt und jeder URI wird in editTextUrl festgelegt. Da es sich um editText handelt, können Sie natürlich selbst über die App damit spielen.

Wenn die GET-Taste gedrückt wird, wird die in der onClick-Eigenschaft definierte onButtonGet-Methode ausgeführt. Erstellen Sie einen neuen Thread, erstellen Sie ein URL-Objekt darin und führen Sie HttpUrlConnection mit dem generierten URL-Objekt aus. Das erhaltene Ergebnis wird in str gespeichert. Verwenden Sie in diesem Fall die von Ihnen definierte InputStreamToString-Methode. (Siehe Referenzseite) Außerdem wird die Zeit von der Ausführung dieser HttpUrlConnection bis zu dem Punkt gemessen, an dem das Ergebnis als Verarbeitungszeit in str gespeichert wird (ich frage mich, ob dies in diesem Fall in Ordnung ist). Versuchen Sie einmal, das erhaltene Ergebnis mit Log.d an die Konsole auszugeben.

Rufen Sie danach eine praktische Methode namens runOnUiThread auf, mit der die Benutzeroberfläche im Hauptthread ausgeführt werden kann, und legen Sie die erhaltene Antwort und die gemessene Zeit in der Benutzeroberfläche fest.

Die InputStreamToString-Methode ist eine Kopie. Wenn Sie sich den Inhalt ansehen, überprüfen Sie zeilenweise, was in der Eingabe (dem Inhalt der Antwort) enthalten ist, und hängen Sie den Rückgabewert an, bis er leer ist. Ich kann das irgendwie verstehen.

Apropos

Übrigens erhalten Sie in dieser API die folgende Antwort (json), wenn Sie einen Test in die Zielabfrage einfügen und diese anfordern.

{"status":"true","res":"GET test success","explain":"GET test successed"}

Es gibt keine tiefe Bedeutung. Ich habe es einfach selbst implementiert.

Ausführungsergebnis

Starten Sie die App

2.png

Jep. Beginnen Sie wie erwartet mit einem beliebigen (fest codierten onCreate) URI. Wenn Sie die GET-Taste drücken, um es auszuführen.

3.png

Wahrscheinlich, weil der Teil der Verarbeitungszeit groß wurde, war der Teil der Ergebnisanzeige falsch rechts ausgerichtet. Www

Das ist alles für heute (´ ・ ω ・ `)

Recommended Posts

Ich habe eine Android-App erstellt, die mit HTTP abgerufen wird
Führen Sie in Java8 geschriebene Anwendungen in Java6 aus
Ich habe versucht, eine Android-Anwendung mit MVC zu erstellen (Java)
Ich habe eine Janken App mit Android gemacht
Ich habe eine Android-App für den MiRm-Dienst erstellt
Ich möchte eine mit Rails 6 erstellte App an GitHub senden
Ich habe einen Adapter für den Kommunikationsunterricht mit Retrofit2 + Rx2 erstellt
Ich habe einen MOD erstellt, der sofort ein Fahrzeug mit Minecraft anruft
Ich war süchtig nach WSl, als ich versuchte, mit Vue.js eine Entwicklungsumgebung für Android-Anwendungen zu erstellen
Informationen zum Erstellen von Apps mit Springboot
Ich habe versucht, mit Eclipse + Tomcat eine http2-Entwicklungsumgebung zu erstellen
Ich habe eine Anmerkung in Java gemacht.
Ich habe eine passende App erstellt (Android App)
[Android] Ich habe eine Schrittzähler-App erstellt.
Ich habe mit Vue.js eine Seite erstellt, die Informationen zur Zuckereinschränkung zusammenfasst
Ich habe mit Ruby einen riskanten Würfel gemacht
Ich habe eine Janken App mit Kotlin gemacht
Ich habe eine Taschenrechner-App für Android erstellt
Punkte, auf die ich beim Erstellen einer Android-App gestoßen bin [Von Zeit zu Zeit aktualisiert]
Die Geschichte einer Android-Anwendung, mit der die Abtastfrequenz des Beschleunigungssensors angepasst werden kann
04. Ich habe mit SpringBoot + Thymeleaf ein Frontend gemacht
Ich habe Mosaikkunst mit Pokemon-Bildern gemacht
Ich habe selbst eine App gemacht! (Leseverwaltungs-App)
Ich habe mit Ruby einen Blackjack gemacht (ich habe versucht, Minitest zu verwenden)
Ich habe einen API-Client für Nature Remo erstellt
Ich habe versucht, eine Anwendung in 2 Sprachen zu entwickeln
Erstellen Sie einen Annotator, der Kuromoji mit NLP4J verwendet. [007]
Ich habe mit Ruby On Rails ein Portfolio erstellt