Boucle pour tester la validiter d'un lien

[Résolu/Fermé]
Signaler
Messages postés
1632
Date d'inscription
lundi 27 septembre 2010
Statut
Membre
Dernière intervention
13 janvier 2017
-
Messages postés
1632
Date d'inscription
lundi 27 septembre 2010
Statut
Membre
Dernière intervention
13 janvier 2017
-
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.

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 !

1 réponse

Messages postés
16409
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
22 octobre 2021
2 901
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 :
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
Messages postés
1632
Date d'inscription
lundi 27 septembre 2010
Statut
Membre
Dernière intervention
13 janvier 2017
68
re,
Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
J'ai cette erreur a la compilation, je crois comprendre qu'il ne peut pas générer un nombre en fonction de la taille de list. Car list est vide.
Messages postés
16409
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
22 octobre 2021
2 901
Pire que ça, la liste n'existe pas. C'est à dire que tu as une valeur
null

J'imagine que c'est lié à l'environnement Android, car en Java pur tu aurais une NullPointerException à ce niveau là.

Il faut donc vérifier les résultats que l'on te transfère pour vérifier qu'ils sont corrects.
List<E> list = ...
if (list == null || list.isEmpty()) {
    // cas particulier où il n'y pas de résultat
}
Messages postés
1632
Date d'inscription
lundi 27 septembre 2010
Statut
Membre
Dernière intervention
13 janvier 2017
68
Je pense que c'est du au fait que je récupère la liste Liste<SerieUpdate> dans un thread et que ca communique mal avec le "thread ui"

Edit, et non ca viens pas de la:

updates = tvdb.getWeeklyUpdates().getSeriesUpdates(); retourne null
Messages postés
16409
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
22 octobre 2021
2 901
Ce n'est pas impossible, il n'y a peut-être pas eu de mis à jour cette semaine...

On peut éventuellement regarder ce qu'il y a eu comme mises à jour :

TVDBUpdates updates = tvdb.getWeeklyUpdates();
String time = updates.getTime();
Log.d("time", time);
List<SeriesUpdate> seriesUpdates = updates.getSeriesUpdates();
Log.d("seriesUpdates", seriesUpdates);
List<EpisodeUpdate> episodeUpdates = updates.getEpisodeUpdates();
Log.d("episodeUpdates", episodeUpdates);
List<BannerUpdate> bannerUpdates = updates.getBannerUpdates();
Log.d("bannerUpdates", bannerUpdates);
Messages postés
1632
Date d'inscription
lundi 27 septembre 2010
Statut
Membre
Dernière intervention
13 janvier 2017
68
En faite il y en a !!

updates = tvdb.getWeeklyUpdates().getSeriesUpdates(); //cree une liste de seriesUpdates index = updates.size(); //longueur de la liste update
rdm = String.valueOf(index); //cast en string pour le log.d
Log.d("index", rdm);

D/index: 2089

Ensuite le met ca dnas une list :
int pos = r.nextInt(index); //crée un random entre 0-2089
SeriesUpdate elt = updates.get(pos);


Et normalement si je fait

int id = elt.getSeriesId(); /
String idS = String.valueOf(id);
s = tvdb.getSeries(idS, "fr");

ET CA FONCTIONNE !!!!!
damn merci infiniment pour ton aide.