OkHttpClient

Fermé
YameFAZE Messages postés 201 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 14 mars 2021 - 10 avril 2017 à 19:02
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 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);
    }
}

5 réponses

BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 895
Modifié le 11 avril 2017 à 11:08
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...
0
YameFAZE Messages postés 201 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 14 mars 2021
11 avril 2017 à 09:59
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 ?
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 895
11 avril 2017 à 11:06
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...
0
YameFAZE Messages postés 201 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 14 mars 2021
Modifié le 17 avril 2017 à 10:55
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_);
    }
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
YameFAZE Messages postés 201 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 14 mars 2021
17 avril 2017 à 11:15
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.
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 895
18 avril 2017 à 09:59
Un seul "client" (je n'aime pas cette terminologie) pour un type d'interaction. Celui-ci sera dédié aux échanges avec la BDD
0
YameFAZE Messages postés 201 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 14 mars 2021 > BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024
18 avril 2017 à 11:33
Comment fais-tu pour appeler la méthode dans le OnClick ?
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 895 > YameFAZE Messages postés 201 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 14 mars 2021
18 avril 2017 à 13:57
C'est de la programmation objet, hein! ;)
Tu crée ton objet (ici, un Singleton pour ton client) et tu appelles ses méthodes...
0