Boucle pour tester la validiter d'un lien
Résolu
louisgautier
Messages postés
1635
Date d'inscription
Statut
Membre
Dernière intervention
-
louisgautier Messages postés 1635 Date d'inscription Statut Membre Dernière intervention -
louisgautier Messages postés 1635 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je travail avec l'api TheTvDbApi (pas très utile a savoir mais sait on jamais)
J'essaye d'obtenir une fiche série aléatoire, en fonction de leur id ( qui est sur 5 ou 6 chiffres)
J'ai donc crée un nombre aléatoire (j’essaye de me limiter car c'est une opération lourde dans un asyncTask apparemment)
Mais ensuite je sèche, car la plus par des id que j’obtienne retourne un 404 not found. Il faut donc absolument que je fasse une boucle pour tester l'id, si null, on recommence, sinon, je fait mon traitement.
Sauf que bah, ça marche pas !! doInBackground fait une dizaine de boucle et le AsyncTask crash (déjà je pense que j'en ferais un thread a par entière, mais plus tard)
Mais au final sur les 10 test, aucun id est valide alors..
Merci de m’éclairer de votre science !
Je travail avec l'api TheTvDbApi (pas très utile a savoir mais sait on jamais)
J'essaye d'obtenir une fiche série aléatoire, en fonction de leur id ( qui est sur 5 ou 6 chiffres)
J'ai donc crée un nombre aléatoire (j’essaye de me limiter car c'est une opération lourde dans un asyncTask apparemment)
Mais ensuite je sèche, car la plus par des id que j’obtienne retourne un 404 not found. Il faut donc absolument que je fasse une boucle pour tester l'id, si null, on recommence, sinon, je fait mon traitement.
protected String[] doInBackground(String... args) { //while (true){ r = new Random( System.currentTimeMillis()); r_id = 200000 + r.nextInt(300000); rdm = String.valueOf(r_id); try{ URL url = new URL("[http://thetvdb.com/api/706CFDB632CA5BB2/series/]"+rdm+"/fr.xml"); if (url.openConnection().toString().equals("HTTP_OK")){ try{ t = tvdb.getSeries(rdm, "fr"); Log.d("r_id", rdm); data[0] = t.getSeriesName(); data[1] = t.getPoster(); Log.d("le titre", t.getSeriesName()); Log.d("banner", t.getPoster()); Log.d("titre", data[0]); Log.d("poster", data[1]); return data; //r = new Random( System.currentTimeMillis()); //r_id = 200000 + r.nextInt(300000); //rdm = String.valueOf(r_id); } catch (TvDbException e){ e.printStackTrace(); } return data; } else { //retour to doInBackground; doInBackground(); } return data; } catch (Exception e){ e.printStackTrace(); } //return data; // } return data; }
Sauf que bah, ça marche pas !! doInBackground fait une dizaine de boucle et le AsyncTask crash (déjà je pense que j'en ferais un thread a par entière, mais plus tard)
Mais au final sur les 10 test, aucun id est valide alors..
Merci de m’éclairer de votre science !
A voir également:
- Boucle pour tester la validiter d'un lien
- Créer un lien pour partager des photos - Guide
- Flash drive tester - Télécharger - Divers Utilitaires
- Lien url - Guide
- Tester son pc - Guide
- Verificateur de lien - Guide
1 réponse
Bonjour,
Ce que tu cherches à faire n'est pas viable, il faudrait d'abord que tu récupères une liste d'id valides avant d'en choisir aléatoirement un dans cette liste.
Par exemple tu récupères la liste des séries les plus récemment mis à jour avec https://api.thetvdb.com/updated/query?fromTime=...
Voir la documentation ici : https://api.thetvdb.com/swagger
Puis avec la liste d'ids obtenu tu fais :
Remarque : la manière dont tu interroges les url c'est vraiment très bas niveau, tu devrais regarder des API standards Java :
https://docs.oracle.com/javaee/7/tutorial/jaxrs-client.htm
https://docs.oracle.com/javaee/7/api/index.html?javax/ws/rs/client/package-summary.html
Ce que tu cherches à faire n'est pas viable, il faudrait d'abord que tu récupères une liste d'id valides avant d'en choisir aléatoirement un dans cette liste.
Par exemple tu récupères la liste des séries les plus récemment mis à jour avec https://api.thetvdb.com/updated/query?fromTime=...
Voir la documentation ici : https://api.thetvdb.com/swagger
Puis avec la liste d'ids obtenu tu fais :
List<Integer> ids = ... int pos = r.nextInt(ids.size()); // entre 0 et ids.size()-1 int id = ids.get(pos);
Remarque : la manière dont tu interroges les url c'est vraiment très bas niveau, tu devrais regarder des API standards Java :
https://docs.oracle.com/javaee/7/tutorial/jaxrs-client.htm
https://docs.oracle.com/javaee/7/api/index.html?javax/ws/rs/client/package-summary.html
Oui j'ai pas l'habitude de travailler avec des api, c'est un peu nouveau pour moi tous ca !!
Je vais essayé de faire comme vous dites. Un asyncTask est suffisant pour ce genre de traitement ?
Pourtant ce que tu fais c'est de l'Android, donc c'est déjà une API...
Et idem pour The TVDB API qui fait d'ailleurs déjà des appels plus haut niveau, il n'y a qu'à voir les exemples...
Nul part tu n'as besoin d'ouvrir toi même ton url.openConnection, laisse l'API faire...
"Un asyncTask est suffisant pour ce genre de traitement ?"
AsyncTask c'est spécifique Android et je ne connais pas, mais vu que l'action ici va être déterministe (tu vas toujours obtenir un résultat immédiatement) je ne sais pas si c'est vraiment utile de faire une tâche asynchrone, la faire en direct ça peut marcher aussi.
Dans ton cas elle devrait avoir cette forme :
Mais je pense que le plus simple est de continuer à utiliser les classes TheTVDBApi que tu as commencer à utiliser (maladroitement certes) et qui seront plus adaptées.
Par exemple, voici la correction de ton code précédent (donc sans URL ni rien)
Même si on est bien d'accord que d'un point de vue algorithmique c'est faux.
Car au final, je questionne l'api mais l'id crée n'est peut être pas valide et donc, j'aurais une erreur !