[JAVA] J'ai créé une application Android qui GET avec HTTP

Je suis un débutant dans le développement d'applications Android qui a écrit cet article l'autre jour. Prenez note de ce que vous avez appris aujourd'hui.

Mise en garde

Cet article a été écrit par des débutants pour noter ce qu'ils ont appris. Il y a de fortes chances qu'il s'écarte du mode de mise en œuvre ou du bon sens, alors soyez prudent lorsque vous l'utilisez comme référence pour l'implémentation, ou vous devriez vous arrêter à vos risques et périls.

Ce que j'ai appris aujourd'hui

-Il semble préférable d'utiliser HttpUrlConnection pour envoyer des requêtes HTTP / GET à partir d'applications Android maintenant-> référence )

-La communication HTTP doit être implémentée de manière asynchrone dans les applications Android. Il est nécessaire de communiquer avec un thread différent du thread qui exécute l'application elle-même.

・ C'est le thread principal qui perturbe l'interface utilisateur de l'application, et le thread principal ne peut pas être falsifié à partir d'un autre thread (l'interface utilisateur ne peut pas être falsifiée) -> Il y a un appareil

Je trébuche de différentes manières, mais étudie en codant pas à pas!

Ce que cet article n'explique pas

La destination pour envoyer la requête cette fois est PHP implémenté par moi-même sur le serveur que j'ai créé, et c'est un programme qui renvoie le résultat avec json de manière appropriée pour une requête GET appropriée. Cet article n'aborde pas cela, ni ne décrit sa mise en œuvre. Écrivons-le séparément.

Ce que j'ai fait aujourd'hui

Avec une telle interface utilisateur, faites une demande avec GET à l'URI entré dans le editText supérieur, et lorsque le résultat est obtenu, écrivez le corps de la réponse dans le editText inférieur.

1.png

"Request URL" est juste un TextView. Mettez-le simplement. J'ai écrit cet article maintenant, mais ce n'est pas une URL mais un URI, mais peu importe lequel

L'écart entre ceci et le bouton écrit comme GET est editTextUrl. Je vais essayer de faire une demande GET pour cette URL (URI). Le bouton GET n'est qu'un bouton. Exécutez la méthode avec onClick. En dessous, editTextResponse est un espace pour afficher le résultat obtenu par la requête. La prochaine fois, mettons un en-tête séparément du corps de la réponse. Secrètement, il y a un petit textViewTime en bas. Mesurez le temps qu'il a fallu pour obtenir la demande et essayez de la générer.

J'ai donc écrit le code suivant.

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://Mon serveur de test/get.php?target=test");
    }

    //Pour vérifier le fonctionnement du bouton, cliquez sur
    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());
                    //Heure de début du traitement
                    startTime = System.currentTimeMillis();
                    HttpURLConnection con = (HttpURLConnection)url.openConnection();
                    final String str = InputStreamToString(con.getInputStream());
                    //Heure de fin du traitement
                    endTime = System.currentTimeMillis();
                    Log.d("HTTP", str);

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            editTextResponse.setText(String.valueOf(str));
                            textViewTime.setText("temps de traitement:" + (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();
    }
}

référence

Communication HTTP (requête GET) sur Android Faire fonctionner l'interface utilisateur du thread principal de l'application à partir d'un autre thread

Commentaire

Lorsque l'application démarre, onCreate est exécuté et


editTextUrl.setText("http://Mon serveur de test/get.php?target=test");

Est exécuté et tout URI est défini dans editTextUrl. Puisqu'il s'agit de editText, vous pouvez bien sûr jouer avec vous-même depuis l'application.

Lorsque vous appuyez sur le bouton GET, la méthode onButtonGet définie dans la propriété onClick est exécutée. Créez un nouveau thread, créez un objet URL dans celui-ci et exécutez HttpUrlConnection à l'aide de l'objet URL généré. Le résultat obtenu est stocké dans str. Si vous le faites, utilisez la méthode InputStreamToString que vous avez définie. (Reportez-vous à la page de référence) En outre, le temps est mesuré à partir de l'exécution de cette HttpUrlConnection jusqu'au point où le résultat est stocké dans str comme temps de traitement (je me demande si cela est correct, dans ce cas). Une fois, essayez de sortir le résultat obtenu sur la console en utilisant Log.d.

Après cela, appelez une méthode pratique appelée runOnUiThread qui peut faire fonctionner l'interface utilisateur sur le thread principal et définir la réponse obtenue et le temps mesuré dans l'interface utilisateur.

La méthode InputStreamToString est une copie. En regardant le contenu, c'est comme vérifier ce qui se trouve dans Input (le contenu de la réponse) ligne par ligne et continuer à ajouter à la valeur de retour jusqu'à ce qu'elle soit vide. Je peux comprendre cela d'une manière ou d'une autre.

Au fait

En passant, dans cette API, si vous mettez test dans la requête cible et que vous le demandez, vous obtiendrez la réponse suivante (json).

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

Il n'y a pas de sens profond. Je viens de l'implémenter moi-même.

Résultat d'exécution

Lancez l'appli

2.png

Ouaip. Comme prévu, commencez avec un URI arbitraire (onCreate codé en dur) inséré. Lorsque vous appuyez sur le bouton GET pour l'exécuter.

3.png

Probablement parce que la partie du temps de traitement est devenue importante, la partie d'affichage des résultats a été mal alignée sur la droite www

C'est tout pour aujourd'hui (´ ・ ω ・ `)

Recommended Posts

J'ai créé une application Android qui GET avec HTTP
Exécuter des applications écrites en Java8 en Java6
J'ai essayé de créer une application Android avec MVC maintenant (Java)
J'ai créé une application Janken avec Android
J'ai créé une application Android pour le service MiRm
Je veux pousser une application créée avec Rails 6 vers GitHub
J'ai fait un adaptateur pour la classe de communication avec Retrofit2 + Rx2
J'ai créé un MOD qui appelle instantanément un véhicule avec Minecraft
J'étais accro à WSl en essayant de créer un environnement de développement d'applications Android avec Vue.js
À propos de la création d'applications avec Springboot
J'ai essayé de créer un environnement de développement http2 avec Eclipse + Tomcat
J'ai fait une annotation en Java.
J'ai créé une application correspondante (application Android)
[Android] J'ai créé une application de podomètre.
J'ai créé un site qui résume les informations sur la restriction du sucre avec Vue.js
J'ai fait une mort risquée avec Ruby
J'ai créé une application Janken avec kotlin
J'ai créé une application de calculatrice sur Android
Points sur lesquels je suis tombé lors de la création d'une application Android [Mis à jour de temps en temps]
L'histoire de la création d'une application Android capable d'ajuster la fréquence d'échantillonnage du capteur d'accélération
04. J'ai fait un frontal avec SpringBoot + Thymeleaf
J'ai fait de l'art de la mosaïque avec des images Pokemon
J'ai créé une application par moi-même! (Application de gestion de la lecture)
J'ai fait un blackjack avec Ruby (j'ai essayé d'utiliser minitest)
J'ai créé un client API pour Nature Remo
J'ai essayé de développer une application en 2 langues
Créer un annotateur qui utilise kuromoji avec NLP4J [007]
J'ai fait un portfolio avec Ruby On Rails