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.
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.
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é.
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( ... );
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 ().
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 ().
src/main/AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
Utilisez l'objet ** HttpURLConnection **.
URL url = new URL("Chaîne URL");
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.
Utilisez ** setRequestMethod () **.
con.setRequestMethod("GET")
Utilisez ** URLConnection # connect () **.
con.connect();
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()
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.
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
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