Android propose diverses options pour la communication Http et le traitement JSON, c'est donc difficile pour les personnes qui l'utilisent occasionnellement. .. .. OkHttp semble être populaire ces jours-ci, je vais donc l'essayer.
Pour le moment, si vous appuyez sur le bouton, vous voulez lancer l'API Web pour obtenir Json, l'analyser et l'afficher.
Installez le programme qui renvoie le Json suivant sur le serveur.
{"status":"OK","message":"Hello2019-05-31 07:06:23"}
L'image ci-dessous.
Préparez-en avant la mise en œuvre.
Ajoutez ce qui suit à AndroidManifest.xml. C'est naturel, mais parfois c'est trop naturel pour l'oublier.
<uses-permission android:name="android.permission.INTERNET" />
Apparemment, une communication autre que https depuis Android 9.x entraînera une erreur. J'obtiens l'erreur suivante.
java.io.IOException: Cleartext HTTP traffic to hoge.com not permitted
hoge.com est le domaine ou sous-domaine auquel vous souhaitez accéder.
Un fichier de configuration est requis pour l'autoriser. C'est gênant, mais ça correspond.
Facilitez un fichier xml avec le contenu suivant. Il semble que le nom et l'emplacement du fichier peuvent être n'importe où (car ils seront explicitement spécifiés dans le processus suivant).
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>
Spécifiez le fichier de configuration spécifié dans AndroidManifest.xml.
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"
...
Ajouter au module Grandle: application et synchronisation.
...
dependencies {
...
implementation 'com.squareup.okhttp3:okhttp:4.0.0-alpha02'
}
...
C'est tout pour la préparation.
Enfin implémenté. Le traitement de la communication, etc. ne peut pas être effectué dans le thread principal pendant une longue période. Il est de notoriété publique qu'il est démarré dans un thread séparé et traité de manière asynchrone. OkHttp semble être décrit comme suit.
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 {
//Déclaration de widget
TextView txt01;
Button btn01;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Initialisation du widget
txt01 = findViewById(R.id.txt01);
btn01 = findViewById(R.id.btn01);
//Clic de bouton
btn01.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//demande http
try{
//Fonction personnalisée utilisant okhttp (ci-dessous)
httpRequest("http://www.bluecode.jp/test/api.php");
}catch(Exception e){
Log.e("Hoge",e.getMessage());
}
}
});
}
void httpRequest(String url) throws IOException{
//Génération OkHttpClinet
OkHttpClient client = new OkHttpClient();
//génération de demande
Request request = new Request.Builder()
.url(url)
.build();
//Requête asynchrone
client.newCall(request)
.enqueue(new Callback() {
//En cas d'erreur
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
Log.e("Hoge",e.getMessage());
}
//Quand normal
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
//récupération de réponse
final String jsonStr = response.body().string();
Log.d("Hoge","jsonStr=" + jsonStr);
//Traitement JSON
try{
//perspective json
JSONObject json = new JSONObject(jsonStr);
final String status = json.getString("status");
//Mise à jour de l'interface utilisateur du thread parent
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
Je pense que vous pouvez implémenter la mise en page comme vous le souhaitez, mais à titre indicatif uniquement.
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>