Sur la base des informations selon lesquelles Volley peut également effectuer un traitement synchrone, les sources suivantes ont été exécutées.
app/build.gradle
dependencies {
implementation 'com.android.volley:volley:1.1.1'
}
MyActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String url = "https://example.com/";
RequestFuture<String> future = RequestFuture.newFuture();
StringRequest stringRequest = new StringRequest(Request.Method.GET, url, future, future);
RequestQueue queue = Volley.newRequestQueue(MyActivity.this);
queue.add(stringRequest);
try {
String result = future.get(10000, TimeUnit.MILLISECONDS);
Log.d(TAG, result);
} catch (Exception e) {
e.printStackTrace();
}
}
J'obtiens une exception java.util.concurrent.TimeoutException. Je ne peux pas voir la cause parce que je peux seulement dire que l'exception a été levée en lisant Logcat.
Depuis Android3.0, NetworkOnMainThreadException se produit lorsque le traitement de synchronisation est exécuté dans le thread d'interface utilisateur. Apparemment, Volley ne tombe pas et s'arrête.
Lorsque je l'ai réécrit comme suit en utilisant AsyncTask, j'ai pu l'obtenir normalement.
MyActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new AsyncTask() {
@Override
protected Object doInBackground(Object[] objects) {
String url = "https://example.com/";
RequestFuture<String> future = RequestFuture.newFuture();
StringRequest stringRequest = new StringRequest(Request.Method.GET, url, future, future);
RequestQueue queue = Volley.newRequestQueue(MyActivity.this);
queue.add(stringRequest);
try {
String result = future.get(10000, TimeUnit.MILLISECONDS);
Log.d(TAG, result);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}.execute();
}
Recommended Posts