IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Retrofit2 et callback


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Etudiant en alternance Licence dev Web/mobile
    Inscrit en
    Mars 2015
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Etudiant en alternance Licence dev Web/mobile

    Informations forums :
    Inscription : Mars 2015
    Messages : 26
    Par défaut Retrofit2 et callback
    Bonsoir le forum,

    C'est après de longues heures devant mon écran à essayer de bricoler mon projet android que je décide de me tourner vers vous !
    J'utilise retrofit pour aller quérir des infos sur la météo (classique).

    Jusque là tout va bien, j'ai réussi à faire mon appel, et à faire des logs du résultat, qui me prouve que l'appel se passe bien.
    Cependant la ou j'ai un gros problème, c'est que je n'arrive pas a exploité ce résultat, puisqu'il semble bloqué dans la callback de retrofit.
    J'ai beau essayer toutes sortes de manière de l'en sortir, pas moyen..

    Un petit bout de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl("http://api.openweathermap.org/data/2.5/")
                    .addConverterFactory(JacksonConverterFactory.create())
                    .build();
            API api = retrofit.create(API.class);
     
     
            Call<CurrentWeather> call = api.getLastMessage("london");
            call.enqueue(new Callback<CurrentWeather>() {
                @Override
                public void onResponse(Call<CurrentWeather> call, Response<CurrentWeather> response) {
                    if (response.isSuccessful()) {
                        response.body() contient mon résultat, je peux l afficher avec les logD donc il est bien là et correct
                    } else {
                        Log.d("FAILURE", "Shit happens :/");
                    }
                }
     
                @Override
                public void onFailure(Call<CurrentWeather> call, Throwable t) {
                    // something went completely south (like no internet connection)
                    Log.d("Error", t.getMessage());
                }
            });
    Admettons que j'utilise ce bout de code dans une classe possédant un champ de type CurrentWeather.
    J'aimerai tout simplement pouvoir dire dans la callback OnResponse:
    this.currentWeather = response.body();

    Mes recherches m'ont montré que cela semble impossible, mais alors,
    Comment diable est-ce que je suis censé exploité ma réponse?
    J'ai essayé différentes manières, appels asynchrones, synchrones, passer par des fonctions tiers, mettre ça dans mes classes, dans mes fragments..
    Bref autant dire que j'ai fais tout et n'importe quoi mais que finalement le résultat est toujours le même:
    Quand j'essai d'accéder à la variable qui est censé contenir mon résultat, en dehors de la callback, je mange un nullpointerexception bête et méchant.

    Je reste dans le coin, je peux fournir plus de code si nécessaire mais j'imagine que le profane que je suis passe simplement à côté de la solution,
    et que vous pourrez m'éclairer facilement.. J'avoue ne pas être expert JAVA, même si j'en ai bouffé pas mal je ne suis pas super familier avec les callback.

    Merci d'avance pour votre aide !

  2. #2
    Membre averti
    Homme Profil pro
    Etudiant en alternance Licence dev Web/mobile
    Inscrit en
    Mars 2015
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Etudiant en alternance Licence dev Web/mobile

    Informations forums :
    Inscription : Mars 2015
    Messages : 26
    Par défaut
    Bonjour

    Je me permet un petit up, j'ai recommencé à travailler sur le projet, et ce problème est toujours bloquant..
    Je suis disponible si besoin d'info supplémentaire ou de code..

    Merci d'avance

  3. #3
    Membre confirmé Avatar de vertebre
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 184
    Par défaut
    Bonjour,

    Je me suis heurté au même problème que toi, il suffit:

    -d'assigner la valeur response.body() dans une variable du type de l'objet que tu veux récupérer.
    -déclarer cette variable en dehors du Callback

    J'ai peut être mal compris à ce niveau mais de ce que j'ai compris toutes les variables du Callback sont détruites à sa fin.

    Espérant t'avoir aidé et ne pas m'être trompé sur l'objet de ta demande.

  4. #4
    Membre averti
    Homme Profil pro
    Etudiant en alternance Licence dev Web/mobile
    Inscrit en
    Mars 2015
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Etudiant en alternance Licence dev Web/mobile

    Informations forums :
    Inscription : Mars 2015
    Messages : 26
    Par défaut
    Houla ! Bonjour à toi, merci pour ton intervention mais le problème date du mois d'avril, tu te doute bien que depuis j'ai fini par passer à autre chose
    Mais effectivement j'ai fini par comprendre que les variables dans la callback sont "locales", et donc non définies hors de cette dernière.
    La solution étant de déclarer une variable dans le scope un cran au dessus de la callback, et d'assigner à cette variable la valeur ou les data qu'on obtient a l'intérieur de la callback, pour pouvoir utilisé ces data dans le reste de la fonction.
    En pratique c'était pas évident, et si quelqu'un qui passe par là peut confirmer ou infirmer la méthode ce serait sympa.
    J'ai parfois vraiment eu l'impression de faire du bricolage juste pour sortir mes données de la callback, parce qu'arrive un moment ou si je les sors pas je rend pas mon projet (projet scolaire).

    Merci d'avance, je passe en résolu tout de même.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fonction callback
    Par saibe dans le forum Linux
    Réponses: 4
    Dernier message: 19/01/2012, 10h41
  2. [Débutant] fonction CALLBACK
    Par tlt dans le forum MFC
    Réponses: 2
    Dernier message: 29/10/2004, 16h55
  3. Callback
    Par el_diablos dans le forum Langage
    Réponses: 2
    Dernier message: 09/07/2004, 08h48
  4. Fonction callback dans une classe
    Par julian_ross dans le forum MFC
    Réponses: 8
    Dernier message: 02/03/2004, 11h42
  5. [MFC] Un callback dans des MFC ...
    Par elsargento dans le forum MFC
    Réponses: 3
    Dernier message: 18/02/2004, 16h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo