[JAVA] Développement Android-Accès WEB (GET) Essayez d'obtenir des données en communiquant avec l'extérieur. ~

introduction

Bonjour. Je suis Wataku, un programmeur côté serveur qui étudie la programmation dans une certaine école. : détendu: Développons également Android cette fois. Cette fois, je voudrais me connecter à un réseau externe avec Android et acquérir des données.

Personne cible

Présentation de l'accès Web

  1. Écrivez le code source pour l'accès http dans l'application. → La plupart des contenus de réponse sont JSON ou XML.
  2. Utilisez le composant d'écran WebView dans l'écran. → Le contenu de la réponse est en principe HTML.

Traitement asynchrone

Pour les choses dont le traitement prend beaucoup de temps, comme l'accès Web, ou pour lesquelles des erreurs inattendues sont susceptibles de se produire, le traitement (traitement asynchrone) est effectué dans un thread distinct du traitement principal. AsyncTask Du traitement asynchrone d'Android, il est pratique d'utiliser la classe AsyucTask lors de l'interaction avec le thread d'interface utilisateur.

1. Comment utiliser AsyncTask

  1. Créez une classe qui hérite de * Asynuc Task. * → Il est pratique de le créer en tant que classe membre privée de la classe d'activité.

    • Décrivez le processus que vous souhaitez exécuter de manière asynchrone dans la méthode doInBackground (). * → Cette méthode est une méthode abstraite d'Asyuc Task, elle doit donc être remplacée.
    • Nouvelle cette classe dans l'activité et exécutez la méthode execute () *
nom de classe de classe privée étend AsyucTask< ... > {
  ...
  @Override
  public String doInBackground( String ... params ) {    
     //Décrivez le traitement asynchrone ici
  }
}
ensuite
Nom de la classe Nom de la variable=nouveau nom de classe(); 
Nom de variable.execute( ... );

2. Autres méthodes

En plus de doInBackground (), AsyucTask possède les méthodes suivantes. Étant donné que ces méthodes sont exécutées sur le thread d'interface utilisateur, il est possible d'utiliser des parties d'écran.

De plus, lorsque cancel () est appelé à partir de l'activité, onCancelled () est exécuté après la fin de doInBackground ().

3. Génériques

Lors de la création d'une classe enfant d'AsyucTask, vous devez écrire trois types dans les génériques. → * Décrivez Void pour ceux qui ne nécessitent pas de spécification de type. *

...Le nom de classe étend AsyucTask<①String, ②Void, ③String> {

①Params

Exécuter () .doInBackground () type d'argument. → L'argument de execute () est passé tel quel comme argument de doInBackground ()

②Progress

publishProgress (). Type d'argument pour onProgressUpdate (). → L'argument de publishProgress () est passé tel quel comme argument de onProgressUpdate ().

③Result

La valeur de retour de doInBackground () et le type de l'argument de onPostExecute (). OnCanceled (). → La valeur de retour de doInBackground () est passée telle quelle en tant qu'argument de onPostExecute () et onCanceled ().

accès http

Donner l'autorisation de connexion Internet

src/main/AndroidManifest.xml


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

Connecter à Internet

Utilisez l'objet ** HttpURLConnection **.

Définissez la chaîne URL.

URL url = new URL("Chaîne URL");

Obtenez une connexion

con = (HttpURLConnection) url.openConnection();

Vous pouvez obtenir l'objet HttpURLConnection (connexion) en exécutant la méthode ** URL # openConnection () ** sur l'objet URL contenant les informations d'URL de destination d'accès.

Paramètres de la méthode d'accès

Utilisez ** setRequestMethod () **.

con.setRequestMethod("GET")

En fait, une connexion Internet

Utilisez ** URLConnection # connect () **.

con.connect();

Coupure

Utilisez ** disconnect () **. Une fois le traitement terminé, il est nécessaire de déconnecter explicitement la connexion afin de ne pas laisser une connexion inutile.

con.disconnect()

Exemple de code pour la requête http

nom de classe de classe privée étend AsyncTask<String, Void, String> {
        private static final String DEBUG_TAG = "marque";

        @Override
        public String doInBackground(String... params) {
            String urlStr = params[0];
            String id = params[1];

            HttpURLConnection con = null;
            InputStream is = null;
            String result = "";

            try {
                URL url = new URL(urlStr);
                con = (HttpURLConnection) url.openConnection();
                con.setRequestMethod("GET");
                con.connect();
                is = con.getInputStream();

                result = is2String(is);
            }
            catch(MalformedURLException ex) {
                Log.e(DEBUG_TAG, "Échec de la conversion d'URL", ex);
            }
            catch(IOException ex) {
                Log.e(DEBUG_TAG, "Échec de la communication", ex);
            }
            finally {
                if (con != null) {
                    con.disconnect();
                }
                if (is != null) {
                    try {
                        is.close();
                    }
                    catch (IOException ex) {
                        Log.e(DEBUG_TAG, "Échec de la libération du flux d'entrée", ex);
                    }
                }
            }
            return result;
        }

        private String is2String(InputStream is) throws IOException {
            BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
            StringBuffer sb = new StringBuffer();
            char[] b = new char[1024];
            int line;
            while(0 <= (line = reader.read(b))) {
                sb.append(b, 0, line);
            }
            return sb.toString();
        }
}

*** InputStream ** est une classe de lecture d'octets.

Gestion de JSON

Utilisez la classe ** JSONObject **. Spécifiez "chaîne de caractères JSON" comme argument.

Après cela, tout en effectuant les opérations suivantes, obtenez le JSONObject cible et obtenez la valeur avec getString (...).

--GetJSONObject (...) pour obtenir le JSONObject directement en dessous --GetJSONArray (...) pour obtenir le JSONArray directement en dessous --GetJSONObject (...) pour obtenir le JSONObject spécifié de JSONArray

Exemple de code pour le traitement JSON

nom de classe de classe privée étend AsyncTask<String, Void, String> {


 @Override
 public void onPostExecute(String result) {
            String title = "";
            String text = "";
            String dateLabel = "";
            String telop = "";
            try {
                JSONObject rootJSON = new JSONObject(result);
                title = rootJSON.getString("title");
                JSONObject descriptionJSON = rootJSON.getJSONObject("description");
                text = descriptionJSON.getString("text");
                JSONArray forecasts = rootJSON.getJSONArray("forecasts");
                JSONObject forecastNow = forecasts.getJSONObject(0);
                dateLabel = forecastNow.getString("dateLabel");
                telop = forecastNow.getString("telop");
            }
            catch(JSONException ex) {
                Log.e(DEBUG_TAG, "L'analyse JSON a échoué", ex);
            }

   }
}

c'est tout. Si vous avez des suggestions telles que quelque chose qui ne va pas, veuillez nous contacter. Merci d'avoir lu jusqu'au bout.

Recommended Posts

Développement Android-Accès WEB (GET) Essayez d'obtenir des données en communiquant avec l'extérieur. ~
Développement Android-Accès WEB (POST) Essayez de communiquer avec l'extérieur et d'envoyer des données. ~
Essayez d'obtenir la clé API de redmine avec ruby
Obtenez des données avec une API créée par la commande curl
Essayez de résumer la disposition commune avec des rails
Essayez d'enregistrer les données pouvant être lues par JavaFX au format PNG
Revenir au début et démarrer avec Java ① Types de données et modificateurs d'accès
J'ai essayé de démarrer avec Spring Data JPA
[Android] Comment obtenir la langue de réglage du terminal
Accédez à l'API Web avec Get sur Android et traitez Json (Java pour le moment)
Comment faire une capture d'écran avec l'émulateur Android Studio
[MT] Spécifiez la catégorie d'article d'Android avec l'API de données
Comment obtenir des valeurs en temps réel avec TextWatcher (Android)
[MT] Spécifiez la catégorie d'article d'Android avec l'API de données
Il est maintenant temps de commencer avec l'API Stream
Lisez les données de Shizuoka Prefecture Point Cloud DB avec Java et essayez de détecter la hauteur de l'arbre.
Essayez d'imiter l'idée d'un tableau à deux dimensions avec un tableau à une dimension
Lorsque l'accès demandé à la ressource est refusé lors de la transmission avec Docker
Exécutez logstash avec Docker et essayez de télécharger des données sur Elastic Cloud
[Android] Je souhaite obtenir l'auditeur à partir du bouton de ListView