同期処理を試す
Volleyでも同期処理ができるという情報をもとに、以下の様なソースを実行させました。
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();
}
}
タイムアウトが発生
java.util.concurrent.TimeoutExceptionが発生します。
Logcatを読んでも例外が投げられたとしか分からないため原因が見えず。
非UIスレッドで実行(解決)
Android3.0以降、UIスレッドで同期処理を実行するとNetworkOnMainThreadExceptionが発生します。
どうやらVolleyの場合は落ちずにタイムアウトになるようです。
※厳密には別の原因かもしれませんが不明
AsyncTaskを使って以下のように書き換えると、正常に取得できました。
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();
}