Posted at

Volleyの同期処理を試そうとして詰まった件(Java)


同期処理を試す

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();
}