java - Android volley Timeout Exception when using RequestFuture.get() -
in fragment, trying use tmdb's open movie db details "now playing" movies.
if use requestfuture.get(time, timeunit) method execute volley request timeout error. if manually test same url in safari, results instantaneously.
what know:
1.) not json parsing error.(the program doesnt progress parsing steps)
2.) no internet issues avd. (reason explained later).
3.) not issue volley singleton class or request queue. (reason explained later).
so im presuming making someother kind of mistake regarding usages of volley/request future.
fragment code below:
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 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 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"); (int = 0; < 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 filter 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 before using requestfuture methods, did same thing implementing own response.listener , response.errorlistener in fragment oncreate(instead of stepa();) , worked!!!
below code-snippet that:
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); so question why doesn't work when implement request future methods?
if ask me why want go synchronous volley implementation; because after have have 2 more volley requests depend on request being fully, completed. , i'm learning :)
sad no-one answer question managed solve issue below:
the timeout happen requestfuture.get() if on same thread ui thread. have changed mechanism of request request done on separate asynch thread(not ui thread) , response received on separate thread request below:
private void stepa() { log.d("rt", "stepa initiated"); final countdownlatch latcha = new countdownlatch(1); thread t = new thread(new runnable() { @override public void run() { log.d("rt", "thread t begins"); threada threada = new threada(); try { jsonobject jsonobject = threada.execute().get(10, timeunit.seconds); parsea(jsonobject); latcha.countdown(); log.d("rt", "thread t ends"); } catch (interruptedexception e) { e.printstacktrace(); } catch (executionexception e) { e.printstacktrace(); } catch (timeoutexception e) { e.printstacktrace(); } } }); t.start(); try { latcha.await(); } catch (interruptedexception e) { e.printstacktrace(); } log.d("rt", "stepa end"); } below asynch task code request:
protected class threada extends asynctask<void, void, jsonobject> { final string url = mbuilder.geturl("box"); public threada() { } @override protected jsonobject doinbackground(void... params) { final requestfuture<jsonobject> future = requestfuture.newfuture(); jsonobjectrequest request = new jsonobjectrequest(request.method.get, url, (string) null, future, future); requestqueue.add(request); try { return future.get(10, timeunit.seconds); } catch (interruptedexception e) { e.printstacktrace(); } catch (executionexception e) { e.printstacktrace(); } catch (timeoutexception e) { e.printstacktrace(); } return null; } } i've added countdown latches cause awesome , cause have few more requests in program depend on snippet's response. hence run program more synchronously.
Comments
Post a Comment