Hallo. Ich bin Wataku, ein serverseitiger Programmierer, der an einer bestimmten Schule Programmieren studiert. : entspannt: Lassen Sie uns auch dieses Mal Android entwickeln. Dieses Mal möchte ich mich mit Android mit einem externen Netzwerk verbinden und Daten erfassen.
Bei Dingen, deren Verarbeitung lange dauert, wie z. B. dem Webzugriff, und bei Dingen, die wahrscheinlich unerwartete Fehler verursachen, wird die Verarbeitung (asynchrone Verarbeitung) in einem von der Hauptverarbeitung getrennten Thread ausgeführt. AsyncTask Bei der asynchronen Verarbeitung von Android ist es praktisch, die AsyucTask-Klasse bei der Interaktion mit dem UI-Thread zu verwenden.
Erstellen Sie eine Klasse, die * Asynuc Task erbt. * * → Es ist praktisch, es als private Mitgliedsklasse der Aktivitätsklasse zu erstellen.
Der Klassenname der privaten Klasse erweitert AsyucTask< ... > {
...
@Override
public String doInBackground( String ... params ) {
//Beschreiben Sie hier die asynchrone Verarbeitung
}
}
danach
Klassenname Variablenname=neuer Klassenname();
Variablennamen.execute( ... );
Zusätzlich zu doInBackground () verfügt AsyucTask über die folgenden Methoden. Da diese Methoden im UI-Thread ausgeführt werden, ist es möglich, Bildschirmteile zu bedienen.
Wenn cancel () von der Aktivität aufgerufen wird, wird onCancelled () ausgeführt, nachdem doInBackground () abgeschlossen ist.
Wenn Sie eine untergeordnete Klasse von AsyucTask erstellen, müssen Sie drei Typen in die Generika schreiben. → * Beschreiben Sie die Leere für diejenigen, für die keine Typspezifikation erforderlich ist. * *
...Der Klassenname erweitert AsyucTask<①String, ②Void, ③String> {
①Params
execute () .doInBackground () Argumenttyp. → Das Argument von execute () wird wie das Argument von doInBackground () übergeben.
②Progress
PublishProgress (). Der Argumenttyp für onProgressUpdate (). → Das Argument von PublishProgress () wird wie das Argument von onProgressUpdate () übergeben.
③Result
Der Rückgabewert von doInBackground () und der Typ des Arguments von onPostExecute (). OnCanceled (). → Der Rückgabewert von doInBackground () wird als Argument von onPostExecute () und onCanceled () übergeben.
src/main/AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
Verwenden Sie das Objekt ** HttpURLConnection **.
URL url = new URL("URL-Zeichenfolge");
con = (HttpURLConnection) url.openConnection();
Sie können das HttpURLConnection-Objekt (Verbindung) abrufen, indem Sie die Methode ** URL # openConnection () ** für das URL-Objekt ausführen, das die URL-Informationen zum Zugriffsziel enthält.
Verwenden Sie ** setRequestMethod () **.
con.setRequestMethod("GET")
Verwenden Sie ** URLConnection # connect () **.
con.connect();
Verwenden Sie ** connect () **. Nach Abschluss der Verarbeitung muss die Verbindung explizit getrennt werden, um keine unnötige Verbindung zu hinterlassen.
con.disconnect()
Der Klassenname der privaten Klasse erweitert AsyncTask<String, Void, String> {
private static final String DEBUG_TAG = "Etikett";
@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, "Fehler bei der URL-Konvertierung", ex);
}
catch(IOException ex) {
Log.e(DEBUG_TAG, "Kommunikationsfehler", ex);
}
finally {
if (con != null) {
con.disconnect();
}
if (is != null) {
try {
is.close();
}
catch (IOException ex) {
Log.e(DEBUG_TAG, "Fehler bei der Freigabe des Eingabestreams", 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 ** ist eine Klasse zum Lesen von Bytes.
Verwenden Sie die Klasse ** JSONObject **. Geben Sie als Argument "JSON-Zeichenfolge" an.
Rufen Sie danach, während Sie die folgenden Operationen ausführen, das Ziel-JSONObject ab und rufen Sie den Wert mit getString (...) ab.
--GetJSONObject (...), um das JSONObject direkt darunter abzurufen --GetJSONArray (...), um das JSONArray direkt darunter zu erhalten --GetJSONObject (...), um das angegebene JSONObject von JSONArray abzurufen
Der Klassenname der privaten Klasse erweitert 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, "JSON-Analyse fehlgeschlagen", ex);
}
}
}
das ist alles. Wenn Sie Vorschläge wie etwas falsches haben, kontaktieren Sie uns bitte. Vielen Dank für das Lesen bis zum Ende.
Recommended Posts