Basierend auf den Informationen, dass Volley auch eine synchrone Verarbeitung durchführen kann, wurden die folgenden Quellen ausgeführt.
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();
}
}
Ich erhalte eine java.util.concurrent.TimeoutException. Ich kann die Ursache nicht erkennen, da ich nur durch Lesen von Logcat feststellen kann, dass die Ausnahme ausgelöst wurde.
Seit Android 3.0 tritt NetworkOnMainThreadException auf, wenn die Synchronisationsverarbeitung im UI-Thread ausgeführt wird. Anscheinend fällt Volley nicht und fällt aus.
Als ich es mit AsyncTask wie folgt umschrieb, konnte ich es normal abrufen.
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