Android bietet verschiedene Optionen für die HTTP-Kommunikation und die JSON-Verarbeitung, sodass es für Benutzer, die es gelegentlich verwenden, schwierig ist. .. .. OkHttp scheint heutzutage sehr beliebt zu sein, also werde ich es versuchen.
Wenn Sie die Taste drücken, möchten Sie vorerst die Web-API starten, um Json abzurufen, zu analysieren und anzuzeigen.
Installieren Sie das Programm, das den folgenden Json auf dem Server zurückgibt.
{"status":"OK","message":"Hello2019-05-31 07:06:23"}
Das Bild unten.
Bereiten Sie einige vor der Implementierung vor.
Fügen Sie der AndroidManifest.xml Folgendes hinzu. Es ist natürlich, aber manchmal ist es zu natürlich, um es zu vergessen.
<uses-permission android:name="android.permission.INTERNET" />
Anscheinend führt eine andere Kommunikation als https von Android 9.x zu einem Fehler. Ich erhalte den folgenden Fehler.
java.io.IOException: Cleartext HTTP traffic to hoge.com not permitted
hoge.com ist die Domain oder Subdomain, auf die Sie zugreifen möchten.
Eine Konfigurationsdatei ist erforderlich, um dies zu ermöglichen. Es ist mühsam, aber es entspricht.
Erleichtern Sie eine XML-Datei mit dem folgenden Inhalt. Es scheint, dass der Dateiname und der Speicherort überall sein können (da dies im nächsten Prozess explizit angegeben wird).
app/res/xml/network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">www.bluecode.jp</domain>
</domain-config>
</network-security-config>
Geben Sie die angegebene Konfigurationsdatei in AndroidManifest.xml an.
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="jp.bluecode.http01">
<application
+ android:networkSecurityConfig="@xml/network_security_config"
android:allowBackup="true"
...
Zum Grandle-Modul hinzufügen: App und Synchronisierung.
...
dependencies {
...
implementation 'com.squareup.okhttp3:okhttp:4.0.0-alpha02'
}
...
Das ist alles zur Vorbereitung.
Endlich umgesetzt. Kommunikationsverarbeitung etc. kann im Haupt-Thread nicht lange durchgeführt werden. Es ist allgemein bekannt, dass es in einem separaten Thread gestartet und asynchron verarbeitet wird. OkHttp scheint wie folgt beschrieben zu werden.
MainActivity.java
MainActivity.java
package jp.bluecode.http01;
import android.os.Handler;
import android.os.Looper;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import org.jetbrains.annotations.NotNull;
import org.json.JSONObject;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class MainActivity extends AppCompatActivity {
//Widget-Deklaration
TextView txt01;
Button btn01;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Widget-Initialisierung
txt01 = findViewById(R.id.txt01);
btn01 = findViewById(R.id.btn01);
//Klicken Sie auf die Schaltfläche
btn01.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//http Anfrage
try{
//Benutzerdefinierte Funktion mit okhttp (unten)
httpRequest("http://www.bluecode.jp/test/api.php");
}catch(Exception e){
Log.e("Hoge",e.getMessage());
}
}
});
}
void httpRequest(String url) throws IOException{
//OkHttpClinet-Generierung
OkHttpClient client = new OkHttpClient();
//Anforderungsgenerierung
Request request = new Request.Builder()
.url(url)
.build();
//Asynchrone Anfrage
client.newCall(request)
.enqueue(new Callback() {
//Im Fehlerfall
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
Log.e("Hoge",e.getMessage());
}
//Wenn normal
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
//Antwortabruf
final String jsonStr = response.body().string();
Log.d("Hoge","jsonStr=" + jsonStr);
//JSON-Verarbeitung
try{
//json Perspektive
JSONObject json = new JSONObject(jsonStr);
final String status = json.getString("status");
//Aktualisierung der Benutzeroberfläche des übergeordneten Threads
Handler mainHandler = new Handler(Looper.getMainLooper());
mainHandler.post(new Runnable() {
@Override
public void run() {
txt01.setText(status);
}
});
}catch(Exception e){
Log.e("Hoge",e.getMessage());
}
}
});
}
}
activity_main.xml
Ich bin der Meinung, dass Sie das Layout nach Belieben implementieren können, jedoch nur als Referenz.
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/txt01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="200dp"
android:text="Hello World!"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btn01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
android:text="Button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/txt01" />
</android.support.constraint.ConstraintLayout>
Recommended Posts