Исключение тайм-аута залпа Android при использовании RequestFuture.get ()
В своем фрагменте я пытаюсь использовать открытую базу данных фильмов TMDB для получения подробных сведений о фильмах «Сейчас играет».
Если я использую метод RequestFuture.get (time, TimeUnit) для выполнения этого запроса залпа, я всегда получаю ошибку тайм-аута. Если я вручную проверяю тот же URL в Safari, я получаю результаты мгновенно.
Что я знаю:
1.) Это не какая-либо ошибка синтаксического анализа JSON (программа даже не переходит на этапы синтаксического анализа)
2.) Нет проблем с интернетом с AVD. (Причина объяснена позже).
3.) Не проблема с моим классом одиночного залпа или моей очередью запросов. (Причина объяснена позже).
Так что я предполагаю, что я делаю какую-то другую ошибку в отношении использования залпа / запроса будущего.
Фрагмент кода ниже:
public class BoxOffice extends android.support.v4.app.Fragment {
private VolleySingleton volleySingleton;
private RequestQueue requestQueue;
private ImageLoader imageLoader;
private ArrayList<MyMovie> movieList;
private MyUriBuilder mBuilder;
public BoxOffice() {
// Required empty public constructor
volleySingleton = VolleySingleton.getInstance();
requestQueue = volleySingleton.getRequestQueue();
mBuilder = new MyUriBuilder();
movieList = new ArrayList<>();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
StepA();
}
public void StepA() {
String url = mBuilder.getURL("box");
Log.d("RT", "StepA initiated - "+ url); // Url is perfect - works when copied in Safari.
RequestFuture<JSONObject> futureA = RequestFuture.newFuture();
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, (String) null, futureA, futureA);
requestQueue.add(request);
try {
JSONObject response = futureA.get(30, TimeUnit.SECONDS);
Log.d("RT", "StepA - response received"); //Never reaches this step
parseJsonFeed(response);
} catch (InterruptedException e) {
Log.e("RT", "StepA - InterruptedException - " + e);
e.printStackTrace();
} catch (ExecutionException e) {
Log.e("RT", "StepA - ExecutionException - " + e);
e.printStackTrace();
} catch (TimeoutException e) {
Log.e("RT", "StepA - TimeoutException - " + e);
e.printStackTrace();
}
Log.d("RT", "StepA END");
}
public void parseJsonFeed(JSONObject response) {
Log.d("RT", "StepA - parseFeed Begin");
if (response == null || response.length() == 0) {
return;
}
MyMovie currentMovie = null;
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
try {
if (response.has("results")) {
Log.d("RT", "StepA - results");
JSONArray resultList = response.getJSONArray("results");
for (int i = 0; i < 3; i++) {
Log.d("RT", "movie " + i);
JSONObject movieElement = resultList.getJSONObject(i);
if (movieElement.has("id") && movieElement.has("title")) {
currentMovie = new MyMovie();
currentMovie.setTmdb_id(movieElement.getString("id"));
currentMovie.setTitle(movieElement.getString("title"));
if (movieElement.has("release_date")) {
currentMovie.setReleaseDate(dateFormat.parse(movieElement.getString("release_date")));
} else {
currentMovie.setReleaseDate(dateFormat.parse("0000-00-00"));
}
movieList.add(i, currentMovie);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
Log.d("RT", "StepA - parseFeed END");
}
}
Logcat с фильтром для тега "RT":
05-30 15:17:51.710 D/RT﹕ TL - Constructor Called
05-30 15:17:51.800 D/RT﹕ StepA initiated - https://api.themoviedb.org/3/movie/now_playing?api_key=##### (link works fine)
05-30 15:18:21.820 E/RT﹕ StepA - TimeoutException - java.util.concurrent.TimeoutException
05-30 15:18:21.820 D/RT﹕ StepA END
Прежде чем использовать методы RequestFuture, я в основном сделал то же самое, реализовав свои собственные Response.Listener и Response.ErrorListener в моем Fragment oncreate (вместо StepA ();), и он РАБОТАЛ !!!
Ниже приведен фрагмент кода для этого:
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, mBuilder.getURL("box"), (String) null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
parseJsonFeed(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getActivity(), error.toString(), Toast.LENGTH_LONG).show();
}
});
requestQueue.add(request);
Итак, мой вопрос, почему это не работает, когда я реализую методы будущего запроса?
Если вы спросите меня, почему я хочу перейти к реализации синхронного залпа; это потому, что после этого у меня должно быть еще два запроса залпа, которые зависят от того, был ли этот запрос полностью, успешно завершен. А также я учусь :)