[JAVA] Asynchrone Verarbeitung und Web-API-Integration in Android Studio

Erstellen Sie eine App, um Wetterinformationen mithilfe der API abzurufen, während Sie das technische Buch lesen.

activity_main.xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <!--Stadtliste anzeigen-->
    <ListView
        android:id="@+id/lvCityList"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="0.5" />

    <!--Layout der unteren Bildschirmhälfte mit Wetterinformationen-->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_marginTop="10dp"
        android:layout_weight="0.5"
        android:orientation="vertical">

        <!--Anzeige "Wetterdetails"-->
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp"
            android:gravity="center"
            android:text="@string/tv_winfo_title"
            android:textSize="25dp"
            />

        <!--Layout, um Städtenamen und Wetter nebeneinander anzuordnen-->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp"
            android:orientation="horizontal">

            <!--Anzeige des Städtenamens-->
            <TextView
                android:id="@+id/tvCityName"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="20sp"/>

            <!--Zeigen Sie das Wetter-->
            <TextView
                android:id="@+id/tvWeatherTelop"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:textSize="20sp"/>
        </LinearLayout>

        <!--Bildschirmteile, mit denen der detaillierte Informationsteil des Wetters gescrollt werden kann-->
        <ScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <!--Detaillierte Wetterinformationen anzeigen-->
            <TextView
                android:id="@+id/tvWeatherDesc"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:textSize="15dp"/>
        </ScrollView>
    </LinearLayout>
</LinearLayout>

AndroidManifest.xml


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.asyncsample">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

strings.xml


<resources>
    <string name="app_name">Wetterinformationen</string>
    <string name="tv_winfo_title">Wetterdetails</string>

</resources>

MainActivity.java


package com.example.asyncsample;

import androidx.appcompat.app.AppCompatActivity;

import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MainActivity extends AppCompatActivity {

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

//Bildschirmteil ListView abrufen
        ListView lvCityList = findViewById(R.id.lvCityList);
//Bereiten Sie ein List-Objekt für die Verwendung mit SimpleAdapter vor
        List<Map<String, String>> cityList = new ArrayList<>();
//Vorbereitung des Kartenobjekts zum Speichern von Stadtdaten und Datenregistrierung in cityList
        Map<String, String> city = new HashMap<>();
        city.put("name", "Osaka");
        city.put("id", "270000");
        cityList.add(city);
        city = new HashMap<>();
        city.put("name", "Kobe");
        city.put("id", "280010");
        cityList.add(city);

//Wird mit SimpleAdapter von verwendet-Vorbereitung von Variablen für bis
        String[] from = {"name"};
        int[] to = {android.R.id.text1};
//Stellen Sie SimpleAdapter ein
        SimpleAdapter adapter = new SimpleAdapter(MainActivity.this, cityList, android.R.layout.simple_expandable_list_item_1, from, to);
//Legen Sie SimpleAdapter in ListView fest
        lvCityList.setAdapter(adapter);
//Stellen Sie den Listener auf ListView ein
        lvCityList.setOnItemClickListener(new ListItemClickListener());
    }

//Eine Mitgliedsklasse, die die Verarbeitung beschreibt, wenn eine Liste ausgewählt wird
    private class ListItemClickListener implements AdapterView.OnItemClickListener{
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id){
//Rufen Sie den Städtenamen und die Stadt-ID der in ListView getippten Zeile ab
            Map<String, String> item = (Map<String, String>) parent.getItemAtPosition(position);
            String cityName = item.get("name");
            String cityId = item.get("id");
//Setzen Sie den erfassten Städtenamen auf tvCityName
            TextView tvCityName = findViewById(R.id.tvCityName);
            tvCityName.setText(cityName + "Wetter:");
//Holen Sie sich TextView, um Wetterinformationen anzuzeigen
            TextView tvWeatherTelop = findViewById(R.id.tvWeatherTelop);
//Holen Sie sich TextView, um detaillierte Wetterinformationen anzuzeigen
            TextView tvWeatherDesc = findViewById(R.id.tvWeatherDesc);
//WeatherInfoReceiver neu. Übergeben Sie die oben erhaltene Textansicht als Argument.
            WeatherInfoReceiver receiver = new WeatherInfoReceiver(tvWeatherTelop, tvWeatherDesc);
//Führen Sie WeatherInfoReceiver aus
            receiver.execute(cityId);
        }
    }

    private class WeatherInfoReceiver extends AsyncTask<String, String, String> {
//Bildschirmteilfeld zur Anzeige des aktuellen Wetters
        private TextView _tvWeatherTelop;

//Bildschirmteilfeld zur Anzeige von Wetterdetails
        private TextView _tvWeatherDesc;

//Konstrukteur
//Die Bildschirmteile, die die Wetterinformationen anzeigen, werden im Voraus erfasst und im Feld gespeichert.
        public WeatherInfoReceiver(TextView tvWeatherTelop, TextView tvWeatherDesc){
            _tvWeatherTelop = tvWeatherTelop;
            _tvWeatherDesc = tvWeatherDesc;
        }
        @Override
        public String doInBackground(String... params){
//Holen Sie sich das erste Argument mit variabler Länge (Index 0). Dies ist die Stadt-ID.
            String id = params[0];
//Erstellen Sie eine Verbindungs-URL-Zeichenfolge mit der Stadt-ID
            String urlStr = "http://weather.livedoor.com/forecast/webservice/json/v1?city=" + id;
//Vom Wetterinformationsdienst erhaltene JSON-Zeichenfolge. Wetterinformationen werden gespeichert.
            String result = "";
//Beschreiben Sie den Vorgang zum Herstellen einer Verbindung mit der obigen URL und zum Abrufen der JSON-Zeichenfolge hier
//Gibt eine JSON-Zeichenfolge zurück
            HttpURLConnection con = null;

            InputStream is = null;
            try{
                URL url = new URL(urlStr);
                con = (HttpURLConnection) url.openConnection();
                con.setRequestMethod("GET");
                con.connect();
                is = con.getInputStream();
                result = is2String(is);
            }
            catch(MalformedURLException ex){

            }
            catch(IOException ex){

            }
            finally{
                if(con != null){
                    con.disconnect();
                }
                if(is != null){
                    try{
                        is.close();
                    }
                    catch(IOException ex){

                    }
                }
            }
            return result;
        }
        @Override
        public void onPostExecute(String result){
//Bereiten Sie Zeichenfolgenvariablen für Wetterinformationen vor
            String telop = "";
            String desc = "";
            try{
                JSONObject rootJSON = new JSONObject(result);
                JSONObject descriptionJSON = rootJSON.getJSONObject("description");
                desc = descriptionJSON.getString("text");
                JSONArray forecasts = rootJSON.getJSONArray("forecasts");
                JSONObject forecastNow = ((JSONArray) forecasts).getJSONObject(0);
                telop = forecastNow.getString("telop");
            }
            catch(JSONException ex){

            }
//Beschreiben Sie hier den Prozess zum Analysieren der JSON-Zeichenfolge für Wetterinformationen.
//Legen Sie die Wetterinformationszeichenfolge in TextView fest
            _tvWeatherTelop.setText(telop);
            _tvWeatherDesc.setText(desc);
        }

    }
    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();
    }
}

Recommended Posts

Asynchrone Verarbeitung und Web-API-Integration in Android Studio
Android Asynchrone UI-Thread-Verarbeitung
Von Java nach C und von C nach Java in Android Studio
Hinweise zu Android Studio
Versuchen Sie, die asynchrone Verarbeitung in Azure zu implementieren
Fügen Sie "@ SuppressWarnings" automatisch in Android Studio ein
Implementierung der asynchronen Verarbeitung in Tomcat
OkHttp3 (GET, POST) in Android Studio
Webanwendungsstruktur nach Java und Verarbeitungsablauf in der Präsentationsschicht
Asynchrone Verarbeitung durch RxJava (RxAndroid) unter Android
Implementierung einer mandantenfähigen kompatiblen asynchronen Verarbeitung in Tomcat
So implementieren Sie die asynchrone Verarbeitung in Outsystems
Verwendung von ExpandableListView in Android Studio
Eindrücke und Zweifel an der erstmaligen Verwendung von Java in Android Studio
Riot (Chat App) Entwicklung (Einstellungen) in Android Studio
Asynchrone Verarbeitung mit regelmäßiger Ausführung in Spring Boot
Sicherheitslücken und Gegenmaßnahmen bei der wichtigen Verarbeitung (Einkaufsabwicklung) (CSRF)
3 Möglichkeiten zum Importieren von Bibliotheken in Android Studio
Verwenden Sie das in Android Studio verwendete JDK im Terminal
Anfänger versuchen Android Studio Teil 2 (Ereignisverarbeitung)
[Android] Alphabetobergrenze und Längenbeschränkung in EditText
Schwierigkeiten bei der Implementierung von Alarm Manager in Android Studio
Repräsentiert "nächster Tag" und "vorheriger Tag" in Java / Android