[JAVA] [Hinweis] http-Kommunikation im Zusammenhang (okhttp3)

verbinden

Kommunikation ist unvermeidlich, solange Sie die App auf Ihrem Smartphone oder Tablet ausführen. Dieses Mal werde ich die http-Kommunikation zusammenfassen. Es scheint, dass es verschiedene Bibliotheken gibt, aber dieses Mal habe ich Okhttp3 verwendet.

Import aus Gradle

Stellen Sie zunächst Okhttp3 in der App zur Verfügung. Fügen Sie es daher zu build.gradle (Modul: App) hinzu. Wählen Sie die gewünschte Version. Vergessen Sie nicht, nach dem Hinzufügen zu synchronisieren.

build.gradle


dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:2.0.2'
    implementation 'com.squareup.okhttp3:okhttp:4.8.0'  //← Fügen Sie diese eine Zeile hinzu
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

Manifesten hinzugefügt

Android scheint standardmäßig keine App-Kommunikation zuzulassen, also spielen Sie mit AndroidManifests.xml. Dieses Mal werde ich zusätzlich zu INTERNET ACCESS_NETWORK_STATE hinzufügen, um zu überprüfen, ob das Terminal mit dem Netzwerk verbunden ist.

AndroidManifests.xml


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

<!--Fügen Sie die beiden unteren Zeilen hinzu-->
<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"
    android:usesCleartextTraffic="true">
    <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>

Okhttp3 Wenn die App mit der neuesten Version von Android kommuniziert, tritt anscheinend ein Fehler auf, wenn er nicht asynchron verarbeitet wird. Um ehrlich zu sein, war dieser Bereich für Anfänger verrückt. Der Grund für die Auswahl war, dass ich zufällig mit Okhttp zusammengearbeitet habe, als ich damit herumgespielt habe. Ich werde das fertige Produkt vorerst darauf legen.

HttpConnector.java


package sample.pack;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkCapabilities;
import android.util.Log;

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

import java.io.IOException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

//Kommunikation im Zusammenhang mit der Web-API
public class HttpConnector  {
    //Ziel-URL
    private String urlStr  = "";
    //Antwortzeichenfolge
    private String respStr = "";
    //JSONArray für die Antwort
    private JSONArray respJsonArr = null;
    //Für die Standby-Verarbeitung
    private int Roop_Count;
    private int Timeout_Sec;
    private CountDownLatch countDownLatch;

    //Setter und Getter
    public String geturlStr(){
        return urlStr;
    }
    public void seturlStr(String urlStr){
        this.urlStr = urlStr;
    }
    //Setter und Getter(Unterstützung für asynchrone Verarbeitung für Antworten)
    public String getrespStr() throws InterruptedException {
        countDownLatch.await(Timeout_Sec, TimeUnit.SECONDS);
        return respStr;
    }
    public void setrespStr(String respStr){
        countDownLatch.countDown();
        this.respStr = respStr;
    }
    public JSONArray getrespJsonArr()  throws InterruptedException {
        countDownLatch.await(Timeout_Sec, TimeUnit.SECONDS);
        return respJsonArr;
    }
    public void setrespJsonArr(JSONArray respJsonArr){
        countDownLatch.countDown();
        this.respJsonArr = respJsonArr;
    }

    //Konstrukteur
    HttpConnector(int Roop_Count, int Timeout_Sec){
        this.Roop_Count = Roop_Count;
        this.Timeout_Sec = Timeout_Sec;
        this.countDownLatch = new CountDownLatch(Roop_Count);
    }

    //Überprüfen Sie, ob das Terminal mit dem Netzwerk verbunden ist
    public boolean checkConnection(Context context){
        ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkCapabilities info = cm.getNetworkCapabilities(cm.getActiveNetwork());
        return info != null;
    }

    //GET-Ausführung
    public void doGet(String urlStr) {
        Request request = new Request.Builder()
                .url(urlStr)
                .get()
                .build();
        conectHttp(request);
    }

    //POST-Ausführung
    public void doPost(String url, String postdata) {
        RequestBody body = RequestBody.create(postdata, MediaType.get("application/json; charset=Shift_JIS"));
        final Request request = new Request.Builder()
                .url(url)
                .post(body)
                .build();
        conectHttp(request);
    }

    //Anfrage senden und Antwort empfangen
    private void conectHttp(Request request) {
        OkHttpClient client = new OkHttpClient();
        client.newCall(request).enqueue(new Callback() {
            //Wenn die Kommunikation fehlschlägt
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
                setrespStr("");
                setrespJsonArr(null);
                Log.d("Status","Failure");
            }
            //Wenn die Kommunikation erfolgreich ist
            @Override
            public void onResponse(Call call, Response response) {
                try {
                    setrespStr(response.body().string());
                } catch (IOException | NullPointerException e) {
                    e.printStackTrace();
                    Log.d("Status","Empty");
                    setrespStr("");
                }
                try {
                    setrespJsonArr(new JSONArray(respStr));
                } catch (JSONException e) {
                    e.printStackTrace();
                    Log.d("Status","Empty");
                    setrespJsonArr(null);
                }
            }
        });
    }
}

Um ehrlich zu sein, es ist ein völlig nicht überzeugender Code, daher zögere ich, aber mit meinen derzeitigen Fähigkeiten war dies die Grenze ... Um es zu verwenden, geben Sie es neu ein, übergeben Sie die URL und erhalten Sie das Ergebnis als String oder JSONArray als Getter. Da es sich um einen asynchronen Prozess handelt, wird der Wert nicht festgelegt, auch wenn Sie Getter unmittelbar nach dem Aufruf von doGet, DoPost, aufrufen, sodass er nicht wie erwartet funktioniert. Also habe ich CountDownLatch verwendet, um den Getter abzuwarten, wenn der Wert im Setter festgelegt wurde. Ich versuche, die Anzahl der Schleifen und die Zeitüberschreitungszeit im Konstruktor festzulegen, aber ich finde, dass es hier nicht sehr klug ist.

Ich verwende Getter an erster Stelle, weil ich den Wert von onResponse nicht zurückgeben konnte. Ich dachte, ich würde die Gemeinsamkeit aufgeben, aber es scheint häufig verwendet zu werden, also sieht es so aus. Übrigens sind die Inhalte von get und post fast gleich.

checkConnection () prüft buchstäblich, ob das Terminal mit dem Netzwerk verbunden ist. Wir verwenden dies, um die App online / offline zu schalten.

Recommended Posts

[Hinweis] http-Kommunikation im Zusammenhang (okhttp3)
[Hinweis] SQLite-bezogen
Hinweise zur HTTP-Kommunikation mit Java (OkHttp)