का उपयोग करते समय एंड्रॉइड वॉली टाइमआउट अपवाद मेरे फ्रैगमेंट में, मैं "अब बजाना" फिल्मों के बारे में विवरण प्राप्त करने के लिए टीएमडीबी की खुली फिल्म डीबी का उपयोग करने की कोशिश कर रहा हूं।RequestFuture.get()
यदि मैं इस वॉली अनुरोध को निष्पादित करने के लिए RequestFuture.get (समय, टाइमयूनीट) विधि का उपयोग करता हूं तो मुझे हमेशा टाइमआउट त्रुटि मिलती है। अगर मैं सफारी में मैन्युअल रूप से उसी यूआरएल का परीक्षण करता हूं, तो मुझे तत्काल परिणाम मिलते हैं।
मुझे क्या पता:
1.) यह किसी भी JSON पार्सिंग त्रुटि नहीं है (कार्यक्रम does not को भी AVD साथ कोई इंटरनेट मुद्दों पार्स चरणों के लिए प्रगति)
2.)।। (कारण बाद में समझाया गया)।
3.) मेरी वॉली सिंगलटन कक्षा या मेरे अनुरोध कतार के साथ कोई समस्या नहीं है। (कारण बाद में समझाया गया)।
तो मुझे लगता है कि मैं वॉली/अनुरोध भविष्य के उपयोग के संबंध में किसी और तरह की गलती कर रहा हूं।
टुकड़ा कोड नीचे:
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 तरीकों का उपयोग कर से पहले, मैं मूल रूप से एक ही बात को लागू किया:
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 मेरा खुद का रिस्पॉन्स। लिस्टनर और रिस्पॉन्स। एरर लिस्टनर मेरे फ्रैगमेंट ऑनक्रेट में (स्टेपए() की बजाय;) और यह काम करता है !!!
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);
तो मेरे सवाल क्यों यह काम नहीं करता है जब मैं अनुरोध भविष्य के तरीकों को लागू:
नीचे उस के लिए कोड-टुकड़ा है?
यदि आप मुझसे पूछें कि मैं सिंक्रोनस वॉली कार्यान्वयन के लिए क्यों जाना चाहता हूं; ऐसा इसलिए है क्योंकि इसके बाद मेरे पास दो और वॉली अनुरोध हैं जो इस अनुरोध पर पूरी तरह से पूर्ण रूप से पूर्ण हो चुके हैं। और यह भी मैं सीख रहा हूँ :)
क्या कोई मेरी मदद कर सकता है? :) – rapidclock