Menu

OkHttpClient [Fermé]

Messages postés
165
Date d'inscription
mardi 24 avril 2012
Statut
Membre
Dernière intervention
21 mai 2019
- - Dernière réponse : BunoCS
Messages postés
14532
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
18 juin 2019
- 18 avril 2017 à 13:57
Bonjour,

Petite question toute bête, la création du client OkHttp est à faire où exactement dans le code ? Sachant que la connexion au script PHP se fait au clique d'un bouton dans l'activité principale. Et d'ailleurs, ce client peut-être dans l'activité principale ou il faut que je le crée dans une activité secondaire et que je fasse appel à lui dans l'activité principale ? Ci-dessous mon activité principale.
import...

/* Déclaration de la classe "Start". */
public class Start extends AppCompatActivity
{
    //////////////////\\\\\\\\\\\\\\\\\\
    //!\\ RESSOURCES DE L'ACTIVITÉ //!\\
    //////////////////\\\\\\\\\\\\\\\\\\

    /* Déclaration des différentes vues qui seront utilisées dans l'activité de la classe "Start". */
    @BindView(R.id.startActivity_conteneurScrollView) ScrollView startActivity_conteneurScrollView;

    ///////////////////\\\\\\\\\\\\\\\\\\\
    //!\\ CYCLE DE VIE DE L'ACTIVITÉ //!\\
    ///////////////////\\\\\\\\\\\\\\\\\\\

    /* Création de l'activité de la classe "Start". */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        /* Initialisation de l'activité de la classe "Start". */
        super.onCreate(savedInstanceState);

        /* Affichage de l'activité "start_activity.xml". */
        setContentView(R.layout.start_activity);

        /* Déclaration de l'activité dans laquelle les vues doivent-être utilisées (contexte). */
        ButterKnife.bind(this);

        //!\\ Apparition de l'activité. //!\\
        /* Association de l'animation "apparition.xml" à la création de la constante "startActivity_constanteAnimation" (de type "Animation"). */
        final Animation startActivity_constanteAnimation = AnimationUtils.loadAnimation(this, R.anim.apparition);
        /* Association de la vue "startActivity_conteneurScrollView" à la création de la constante "startActivity_constanteAffichage" (de type "View"). */
        final View startActivity_constanteAffichage = startActivity_conteneurScrollView;
        /* Association des deux constantes. */
        startActivity_constanteAnimation.setFillAfter(true);
        /* Lancement de l'animation. */
        startActivity_constanteAffichage.startAnimation(startActivity_constanteAnimation);
    }

    //////////////////\\\\\\\\\\\\\\\\\\
    //!\\ INTERACTIONS UTILISATEUR //!\\
    //////////////////\\\\\\\\\\\\\\\\\\

    /* Translation de "Start" vers "Index". */
    @OnClick(R.id.startActivity_boutonConnexion)
    public void startActivity_boutonConnexion_clique()
    {
        /* Création du lien "lien_Start_Index" entre les classes "Start" et "Index". */
        Intent lien_Start_Index = new Intent(Start.this, Index.class);
        /* Lancement de la translation. */
        startActivity(lien_Start_Index);
    }

    /* Translation de "Start" vers "InscriptionObligative". */
    @OnClick(R.id.startActivity_boutonInscription)
    public void setStartActivity_boutonInscription_clique()
    {
        /* Création du lien "lien_Start_InscriptionObligative" entre les classes "Start" et "InscriptionObligative". */
        Intent lien_Start_InscriptionObligative = new Intent(Start.this, InscriptionObligative.class);
        /* Lancement de la translation. */
        startActivity(lien_Start_InscriptionObligative);
    }
}
Afficher la suite 

5 réponses

Messages postés
14532
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
18 juin 2019
929
0
Merci
De mon côté, j'utilise une classe static pour gérer mon client HTTP (attention code tronqué):

public class Server {

    private Server() {
    }

    private static Gson sGson;

    /**
     * Check if the application is connected to internet
     *
     * @return true if connected (mobile or wifi), false otherwise
     */
    public static boolean hasConnectivity(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();

        return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
    }

    public static boolean hasWifiConnectivity(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();

        return activeNetwork != null && activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;
    }

    public static OkHttpClient getHttpClient(boolean secured) {
        HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
        logging.setLevel(HttpLoggingInterceptor.Level.BODY);

        OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder()
                .connectTimeout(30, TimeUnit.SECONDS)
                .readTimeout(30, TimeUnit.SECONDS));

        if (BuildConfig.DEBUG) {
            okHttpClientBuilder.addInterceptor(logging);
        }

        return okHttpClientBuilder.build();
    }

    public static APIError parseError(Throwable e) {
        if (e instanceof HttpException) {
            HttpException httpException = (HttpException) e;
            return sGson.fromJson(httpException.response().errorBody().charStream(), APIError.class);
        }
        return null;
    }
}



Edit: j'ai changé la visibilité de la méthode getHttpClient()

@+ 
Buno, Modo CS-CCM 
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai... 
The urgent is done, the impossible is underway. For miracles, provide for a delay...
Messages postés
165
Date d'inscription
mardi 24 avril 2012
Statut
Membre
Dernière intervention
21 mai 2019
0
Merci
Ta classe est indépendante de l'activité principale ? Tu fais appel à elle depuis l'activité principale ou cette classe est intégrée dans l'activité principale ?

Et la création OU l'appel du OkHttpClient je la fais dans le code du bouton directement ?
/* Translation de "Index" vers "". */
    @OnClick(R.id.indexActivity_boutonConnexion)
    public void indexActivity_boutonConnexion_clique()
    {

------- OkHttpClient ici ? -------

        /* Création du lien "lien_Index_" entre les classes "Index" et "". */
        Intent lien_Index_ = new Intent(Index.this, .class);
        /* Lancement de la translation. */
        startActivity(lien_Index_);
    }


Ou à l'extérieur du code du bouton en faisant une liaison ?
------- OkHttpClient ici ? -------

/* Translation de "Index" vers "". */
    @OnClick(R.id.indexActivity_boutonConnexion)
    public void indexActivity_boutonConnexion_clique()
    {
        /* Création du lien "lien_Index_" entre les classes "Index" et "". */
        Intent lien_Index_ = new Intent(Index.this, .class);
        /* Lancement de la translation. */
        startActivity(lien_Index_);
    }


J'ai vu également qu'il était possible de créer un fichier de cache. Nécessaire ou pas ?
Messages postés
14532
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
18 juin 2019
929
0
Merci
Ma classe est indépendante, oui. Je peux l'appeler d'où je veux, c'est-à-dire où j'en ai besoin.
J'ai l'impression que tu te méprends sur une notion: l'appel de méthode d'une classe à partir d'une autre. Il n'est pas nécessaire de créer un Intent pour utiliser OkHttp. Un Intent sert à passer des passer des paramètres (ou un contexte de manière générale) d'une Activity à une autre. Rien ne t'empêche d'appeler les méthodes de ma classe Server (par exemple) dans le onClick:

@OnClick(R.id.indexActivity_boutonConnexion)
    public void indexActivity_boutonConnexion_clique()
    {
        OkHttp okClient = Server.getHttpClient(false);
        // ...
    }


Sauf que, de manière plus propre, je te conseille de te documenter sur le modèle MVC, Model View Controller, qui te permet de structurer ton code.

J'ai vu également qu'il était possible de créer un fichier de cache. Nécessaire ou pas ?
A toi de voir si tu veux du cache. Pour du login, je ne suis pas sûr que cela soit utile...
Messages postés
165
Date d'inscription
mardi 24 avril 2012
Statut
Membre
Dernière intervention
21 mai 2019
0
Merci
Oui mais sachant que je veux que le client soit appelé lorsque l'utilisateur clique sur le bouton de connexion, il faut que j'appelle la méthode du client dans le OnClick, et de préférence hiérarchiquement après toutes les méthodes de vérification puisque je veux que le client ne soit utilisé QUE si toutes les vérifications ont été faites. Enfin si je ne dis pas de bêtise. Donc idéalement il faut que je crée mon client dans une classe séparée, et que j'appelle cette classe dans le OnClick, comme ceci :
////////////\\\\\\\\\\\\
    //!\\ INTERACTIONS //!\\
    ////////////\\\\\\\\\\\\

    /* Implémentation des différentes ressources prédéclarées. */
    final EditText pseudo = (EditText) indexActivity_blocPseudo_champs;
    final EditText motDePasse = (EditText) indexActivity_blocMotDePasse_champs;
    final EditText pseudoVerification = (EditText) indexActivity_blocVerificationPseudo_champs;
    final EditText motDePasseVerification = (EditText) indexActivity_blocVerificationMotDePasse_champs;
    final EditText eMail = (EditText) indexActivity_blocEmail_champs;
    final EditText eMailVerification = (EditText) indexActivity_blocVerificationEmail_champs;

    /* Translation de "Index" vers "". */
    @OnClick(R.id.indexActivity_boutonInscription)
    public void indexActivity_boutonInscription_clique()
    {
        //...

---------- APPEL DU CLIENT ICI ? ----------

        //!\\ Instructions de la translation. //!\\
        /* Création du lien "lien_Index_" entre les classes "Index" et "". */
        Intent lien_Index_ = new Intent(Index.this, .class);
        /* Lancement de la translation. */
        startActivity(lien_Index_);
    }
}
Messages postés
165
Date d'inscription
mardi 24 avril 2012
Statut
Membre
Dernière intervention
21 mai 2019
0
Merci
Petite question en parallèle. Tu me conseilles de faire un client qui fait tout (vérification de l'existence des identifiants dans la bdd externe + écriture des identifiants dans la bdd externe si inexistants) ? Ou de faire un client pour chaque chose ? Genre j'appelle un client pour la vérification de l'existence des identifiants, puis s'ils n'existent pas, j'appelle juste derrière un autre client qui lui va écrire les nouveaux identifiants dans la bdd externe.
BunoCS
Messages postés
14532
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
18 juin 2019
929 -
Un seul "client" (je n'aime pas cette terminologie) pour un type d'interaction. Celui-ci sera dédié aux échanges avec la BDD
YameFAZE
Messages postés
165
Date d'inscription
mardi 24 avril 2012
Statut
Membre
Dernière intervention
21 mai 2019
> BunoCS
Messages postés
14532
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
18 juin 2019
-
Comment fais-tu pour appeler la méthode dans le OnClick ?
BunoCS
Messages postés
14532
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
18 juin 2019
929 > YameFAZE
Messages postés
165
Date d'inscription
mardi 24 avril 2012
Statut
Membre
Dernière intervention
21 mai 2019
-
C'est de la programmation objet, hein! ;)
Tu crée ton objet (ici, un Singleton pour ton client) et tu appelles ses méthodes...