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.
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'
}
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.