Nel mio frammento, sto tentando di utilizzare il DB del film aperto di TMDB per ottenere dettagli sui filmati "In riproduzione".Eccezione time-volley Android durante l'utilizzo di RequestFuture.get()
Se utilizzo il metodo RequestFuture.get (time, TimeUnit) per eseguire questa richiesta di scarica, ottengo sempre un errore di timeout. Se provo manualmente lo stesso Url in Safari, ottengo i risultati istantaneamente.
quello che so:
1.) Non è un qualsiasi errore di analisi JSON (per la squadra di programma ancora progredire per le fasi di analisi)
2.) Non ci sono problemi con internet AVD.. (La ragione è stata spiegata in seguito).
3.) Non è un problema con la mia classe di volley singleton o la mia coda di richiesta. (La ragione è stata spiegata in seguito).
Quindi presumo che sto facendo un altro tipo di errore per quanto riguarda gli usi di volley/Richiedi futuro.
Codice Frammento di seguito:
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 con il filtro per il tag "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
Prima di utilizzare i metodi RequestFuture, ho praticamente fatto la stessa cosa attuazione il mio Response.Listener e Response.ErrorListener nel mio frammento oncreate (invece del StepA();) e ha funzionato !!!
Di seguito si riporta il codice snippet che:
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);
Quindi la mia domanda è: perché non funziona quando a implementare la richiesta di metodi futuri?
Se mi chiedi perché voglio andare per l'implementazione del volley sincrono; è perché dopo questo devo avere altre due richieste di scarica che dipendono da questa richiesta essere completamente, completata con successo. E anche io sto imparando :)
qualcuno può aiutarmi per favore? :) – rapidclock