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 :

requete mysql + paramètre + return données + quand effectuer traitement avec les paramètres ?


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 requete mysql + paramètre + return données + quand effectuer traitement avec les paramètres ?
    Bonjour,


    Je tente de construire une AsyncTask pour effectuer une requête sur une BDD MySQL;

    Ma requête renvoie une liste d’élément (contenant 20 entrées max) que je pense convertir en JSON (je récupérerai donc çà en résultat de mon AsyncTask).

    Mais voilà sur les éléments que je requête je dois faire attention à ne pas récupérer certains éléments portant certains ID.
    Mes ID sont des chaine de caractère, que je souhaite passé en paramètre(String[]) ou pas à ma méthode qui effectue ma requête.

    Le traitement à faire sur ces ID est simple, dès qu'un élément requêté en BDD portent le même ID que ceux présent dans mon String[] je ne l'affiche pas.

    Ma question donc est : Quand faire la vérification des ID et quel est le mieux ?

    Si vous avez des critiques sur les solutions que j'ai trouvées; j’apprécie tjrs
    - Soit en java après la requête (mais je requête des éléments que je n'ai pas besoin) et donc si je veux avoir 20 éléments il me faut refaire un requête
    - Soit en PHP mais je dois passé mon tableau de string au PHP et faire la vérification avec.


    bonne après-midi

  2. #2
    Modérateur
    Avatar de MasterMbg
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 719
    Par défaut
    Bonjour,

    Citation Envoyé par vertebre Voir le message
    Mais voilà sur les éléments que je requête je dois faire attention à ne pas récupérer certains éléments portant certains ID.
    Mes ID sont des chaine de caractère, que je souhaite passé en paramètre(String[]) ou pas à ma méthode qui effectue ma requête.
    Sans hésiter je serais pour :
    • Envoyer la liste des idS des éléments concernés (à ne pas récupérer dans la base de données) depuis le client Android
    • Côté Php, requêter en excluant les éléments dont les idS se trouvant dans la liste reçue et renvoyer le résultat



    Christian Djo,
    Plus tu apprends sérieusement, plus tu te rapproches d'un savoir noble. Une chose est certaine, les difficultés ne s'écarteront de ton chemin...

    Tu es nouveau dans le développement Android, la page des COURS est là pour te faciliter la vie
    Tu peux trouver la réponse à ta question dans la FAQ
    Retrouvez mon tutoriel sur la consommation des services web SOAP
    Pense à voter positivement en appuyant sur en bas à droite de la réponse qui t'a donné une piste de solution.

  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
    merci pour ta réponse je peux continuer à avancer grâce à toi

  4. #4
    Membre Expert
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Par défaut
    C'est typiquement le travail de ton script serveur, disons /data.php, auquel tu passes un paramètre spécial, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://myserver.com/data.php?exclude=id1|id8|id34|id55
    Dès que ton script serveur est prêt, c-a-d que l'URL ci-dessus fonctionne et renvoie du JSON, tu peux utiliser http://gendroid.univ-pau.fr/remoteDatabase.html pour obtenir automatiquement le code de l'AsyncTask.
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  5. #5
    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
    re, bonjour

    @Hephaistos007
    si je comprend bien, tu passes par GET pour passer des paramètres dans ton URL ? mais dans mon cas si je veux passer un tableau de String[] je ne vais pas mettre toutes ses valeurs(>40) dans l'URL

    Pour revenir à cette AsyncTask, j'ai suivi le tuto sur developpez sur OKIO, et donc je souhaite utiliser OkHttpClient pour mes requêtes et Moshi pour convertir l'objet JSON reçu par mon PHP en objet Java(utilisable dans mon appli).

    Seul bémol, et je n'en suis pas sur, c'est que si j'utilise OKIO pour faire ma requête et passer mon String[] au php je n'utilise pas d'AyncTask ? ou le traitement OKIO se fait dans une AsyncTask au contraire ? car j'ai lu que OKIO me permettait d'intercepter les requêtes tandis que AT non, donc pour moi ce serait 2 solutions différentes mais je n'en suis pas sur.

    bonne journée,

  6. #6
    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
    Du coup j'ai tenté pas mal de chose pour transmettre mon String[] mais sans succès.

    1ère solution :
    - J'ai 1 procédure sendTab() qui envoie(serait sensée) un string json au php
    - J'apelle la procédure onRefresh() dans le Handler du RefreshSwipeLayout, qui apelle elle même cette procéduresendTab() (et d'autres pour d'autre taitements).
    - J'obtiens une erreur "FATAL EXCEPTION: main android.os.NetworkOnMainThreadException" à la ligne "Response response = client.newCall(request).execute();" de la procédure sendTab()
    -> l'URL répond lorsque je le test sur mon navigateur.

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    package novtonrak.perstud.com.novtonrak;
     
    import android.content.Context;
    import android.net.Uri;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.os.Handler;
    import android.support.v4.app.Fragment;
    import android.support.v4.widget.SwipeRefreshLayout;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    import android.widget.Toast;
     
    import com.google.gson.Gson;
    import com.squareup.moshi.Json;
    import com.squareup.moshi.JsonAdapter;
    import com.squareup.moshi.Moshi;
    import com.squareup.moshi.ToJson;
     
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
     
    import java.io.File;
    import java.io.IOError;
    import java.io.IOException;
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.ExecutionException;
     
    import novtonrak.perstud.com.novtonrak.lastnove.IDLastNove;
    import novtonrak.perstud.com.novtonrak.lastnove.LastNove;
    import novtonrak.perstud.com.novtonrak.lastnove.LastNoveAdapterListener;
    import novtonrak.perstud.com.novtonrak.lastnove.LastNoveAdapter;
    import novtonrak.perstud.com.novtonrak.profil.Profil_LOCAL;
    import novtonrak.perstud.com.novtonrak.ressources.OnObject.IConvert;
    import novtonrak.perstud.com.novtonrak.ressources.request_mysql.OkHttpHandler_PostIDTab;
    import okhttp3.Cache;
    import okhttp3.Call;
    import okhttp3.Interceptor;
    import okhttp3.MediaType;
    import okhttp3.OkHttpClient;
    import okhttp3.Request;
    import okhttp3.RequestBody;
    import okhttp3.Response;
    import okio.BufferedSink;
    import okio.ByteString;
    import okio.GzipSink;
    import okio.Okio;
     
     
    public class tab1_LastNoveFragment extends Fragment implements LastNoveAdapterListener, SwipeRefreshLayout.OnRefreshListener, IConvert {
     
        // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
        private static final String ARG_PARAM1 = "param1";
        private static final String ARG_PARAM2 = "param2";
        // TODO: Rename and change types of parameters
        private String mParam1;
        private String mParam2;
     
        private SwipeRefreshLayout mySwipeRefreshLayout;
        private OnFragmentInteractionListener mListener;
        private LastNoveAdapter LLAdapter;
        private ListView list;
        private String[] tab_idlastnove={"#021", "#1032", "etc", "..."};  // id des lastnove affichés, à récupérer depuis le profil local
        private LastNove[] new20lastNoves=null;  // stocke les 20 prochains lastnove affiché
        private OkHttpClient client= null;   // On crée un objet OkHttpClient pour se connecter dans l'asyncTask
        private final Gson gson = new Gson();
        private static final String BASE_URL_LL = "http://192.168.1.5/services/getlastnove.php";
        private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
        public static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("text/x-markdown; charset=utf-8");
        private Cache cache;    // Permet de créer un cache pour les lecture/ecritures de flux(buffer) utilisés avec OkHttpClient
     
        public static int responseCode = 0;
        public static String responseString = "";
     
        public tab1_LastNoveFragment() {
            // Required empty public constructor
        }
     
        /**
         * Use this factory method to create a new instance of
         * this fragment using the provided parameters.
         *
         * @param param1 Parameter 1.
         * @param param2 Parameter 2.
         * @return A new instance of fragment tab1_LastNoveFragment.
         */
        public static tab1_LastNoveFragment newInstance(String param1, String param2) {
     
            tab1_LastNoveFragment fragment = new tab1_LastNoveFragment();
            Bundle args = new Bundle();
            args.putString(ARG_PARAM1, param1);
            args.putString(ARG_PARAM2, param2);
            fragment.setArguments(args);
            return fragment;
        }
     
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
     
            if (getArguments() != null) {
                mParam1 = getArguments().getString(ARG_PARAM1);
                mParam2 = getArguments().getString(ARG_PARAM2);
            }
            client = getClient();
        }
     
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                  Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            View view = inflater.inflate(R.layout.lastnove_main, container, false); // on recupere la view
            mySwipeRefreshLayout = (SwipeRefreshLayout)view.findViewById(R.id.swiperefresh_lastnove);   // on recupere le swiperefreshlayout
            list = (ListView)view.findViewById(R.id.ListView01);       // on recupere la list
     
            ArrayList<LastNove> listLastNove = LastNove.getAListOfLastNove();   // on recupere la liste de lastnove du layout
            LLAdapter = new LastNoveAdapter(getActivity(), listLastNove); // on declare un nouvel adapter sur la list
     
            LLAdapter.addListener(this);  // on declare un listenner sur les item de la list
            //mySwipeRefreshLayout.setEnabled(false); // a désactiver pour que les fct° de rafraichissement fonctionne // on désative le rafraishisement et on l'active dés que le 1er item de la list est visible
            list.setAdapter(LLAdapter);   // on applique un adapter sur la liste
     
            /* On récupère l'id du layout de la liste pour lui assigner un listenner de down-swipe refresh */
            mySwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
                @Override
                public void onRefresh() {
                    mySwipeRefreshLayout.setRefreshing(true);
                    ( new Handler()).postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            mySwipeRefreshLayout.setRefreshing(true);
                            // On fait le onRefresh içi ou on fait çà dans une async task
                            onRefresh();
                        }
                    }, 3000);
                }
            });
            mySwipeRefreshLayout.setOnRefreshListener(this);
     
            return view;
        }
     
     
        // TODO: Rename method, update argument and hook method into UI event
        public void onButtonPressed(Uri uri) {
            if (mListener != null) {
                mListener.onFragmentInteraction(uri);
            }
        }
        @Override
        public void onAttach(Context context) {
            Log.w("LAstNoveFrag", "OnAttachCalled");
            super.onAttach(context);
            if (context instanceof OnFragmentInteractionListener) {
                mListener = (OnFragmentInteractionListener) context;
            } else {
                throw new RuntimeException(context.toString()
                        + " must implement OnFragmentInteractionListener");
            }
        }
        @Override
        public void onDetach() {
            super.onDetach();
            mListener = null;
        }
     
        @Override
        public void onClickButtonImage(LastNove item, int position) {
     
        }
        @Override
        public void onClickItemLayout(LastNove item, int position) {
     
        }
     
     
        /* Procédure onRefresh de swiperefreshlayout */
        @Override
        public void onRefresh() {
            /* 1ere requête : Envoie du tableau d'DI */
            try {
                sendTab(BASE_URL_LL, tab_idlastnove);
            } catch (IOError ioError) {
                Log.e("erreur IOError",ioError.getMessage());
            } catch (IOException io) {
                Log.e("erreur IOException",io.getMessage());
            }
     
           /* 2eme requête : Requete des 20 derniers LastNove
           try {
            get20NewLL(BASE_URL_LL);
            } catch (IOError ioError) {
                Log.e("erreur IOError",ioError.getMessage());
            } catch (IOException io) {
                Log.e("erreur IOException",io.getMessage());
            }*/
        }
     
        /* AsyncTask OkHttpClient pour récupérer les 20derniers last nove excepté lastnove ayant pour id les même que ceux déja affiché */
     
            // Méthode qui envoie des donnée JSON à la bdd
            public void sendTab(String url, String[] id_listlastnove) throws IOException {
     
                try {
                    // On crée un objet Moshi (intermédiaire de conversion)
                    Moshi moshi = new Moshi.Builder().build();
                    // On créer un adapter pour gérer la conversion du type de l'objet -> String[] içi
                    JsonAdapter<String[]> jsonAdapter = moshi.adapter(String[].class);
                    // On crée l'objet Json à partir de l'adapter
                    String json_tab_idLastNove = jsonAdapter.toJson(id_listlastnove);
     
                    Request request = new Request.Builder()
                            .url(url)
                            .post(RequestBody.create(MEDIA_TYPE_MARKDOWN,json_tab_idLastNove))
                            .build();
     
                    Response response = client.newCall(request).execute();
     
                    //if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
     
                    /*
                    //System.out.println(response.body().string());
     
                    // On gère les code de réponse renvoyée par la requête
                        // Reset the response code
                        responseCode = 0;
                        if ((responseCode = response.code()) == 200) {
                            // Get response
                            String jsonData = response.body().string();
     
                            // Transform reponse to JSon Object
                            JSONObject json = new JSONObject(jsonData);
     
                            // Use the JSon Object
                            Toast.makeText(getActivity(), "Code réponse en json objetct.toString() = \n"+json.getString("token"), Toast.LENGTH_LONG).show();
                        }
                    */
     
                }
                catch (IOException io) {
                    // Erreur lecture ou écriture
                }
                /*
                catch (JSONException e) {
                    responseString = e.toString();
                }
                */
     
            }
            /* Méthode qui requête à la bdd 20newLastlave */
            /*
    			public LastNove[] get20NewLL(String url) throws IOException {
                // On construit la requête
                Request request = new Request.Builder()
                        .url(url)
                        .build();
     
                // On Execute la requete
                Response response = client.newCall(request).execute();
                // On gère les erreurs en cas de réponse null
                if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
     
                // On récupère le résultat en Json et on recrée notre objet
                Moshi moshi = new Moshi.Builder().build();
                // On crée un adapter pour convertir l'objet Json en objet java (avec Moshi)
                JsonAdapter<LastNove> jsonAdapter_ll = moshi.adapter(LastNove.class);
                // On recrée notre objet
                LastNove[] tab_new20LAstNove = gson.fromJson(response.body().charStream(), LastNove[].class);
     
                return tab_new20LAstNove;
            }
            */
     
         /* Procédures/Fonctions OkHttpClient */
     
            /* Créer et retourne un client OkHttpClient(pour se connecter) et lui assigne un ' fichier de cache ' */
            private  OkHttpClient getClient(){
                if(client==null) {
                    //Assigning a CacheDirectory
                    File myCacheDir = new File(getContext().getCacheDir(), "OkHttpCache");
                    //you should create it...
                    int cacheSize = 1024 * 1024;
                    Cache cacheDir = new Cache(myCacheDir, cacheSize);
                    client = new OkHttpClient.Builder()
                            .cache(cacheDir)
                            //.addInterceptor(getInterceptor()) // on ajoute un interceptor pour intercepter les requêtes et pouvoir faire du log
                            //.addInterceptor(new GzipRequestInterceptor()) // on ajoute un interceptor pour compresset le flux entrant et sortant pour economie de BP
                            .build();
                }
     
                //now it's using the cache
                return client;
            }
     
     
            /*public Interceptor getInterceptor() {
                return new LoggingInterceptor();
            }
            */
            /* Interceptor pour les requetes */
            /*class LoggingInterceptor implements Interceptor {
                //Code pasted from okHttp webSite itself
                @Override
                public Response intercept(Chain chain) throws IOException {
                    Request request = chain.request();
                    long t1 = System.nanoTime();
                    Log.e("Interceptor Sample", String.format("Sending request %s on %s%n%s",
                            request.url(), chain.connection(), request.headers()));
     
                    Response response = chain.proceed(request);
     
                    long t2 = System.nanoTime();
                    Log.e("Interceptor Sample", String.format("Received response for %s in %.1fms%n%s",
                            response.request().url(), (t2 - t1) / 1e6d, response.headers()));
     
                    return response;
                }
            }
            */
            /* This interceptor compresses the HTTP request body. Many webservers can't handle this! */
        /*
            final class GzipRequestInterceptor implements Interceptor {
                @Override
                public Response intercept(Chain chain) throws IOException {
                    Request originalRequest = chain.request();
                    if (originalRequest.body() == null
                            || originalRequest.header("Content-Encoding") != null) {
                        return chain.proceed(originalRequest);
                    }
     
                    Request compressedRequest = originalRequest.newBuilder()
                            .header("Content-Encoding", "gzip")
                            .method(originalRequest.method(), gzip(originalRequest.body()))
                            .build();
                    return chain.proceed(compressedRequest);
                }
                private RequestBody gzip(final RequestBody body) {
                    return new RequestBody() {
                        @Override
                        public MediaType contentType() {
                            return body.contentType();
                        }
     
                        @Override
                        public long contentLength() {
                            return -1; // We don't know the compressed length in advance!
                        }
     
                        @Override
                        public void writeTo(BufferedSink sink) throws IOException {
                            BufferedSink gzipSink = Okio.buffer(new GzipSink(sink));
                            body.writeTo(gzipSink);
                            gzipSink.close();
                        }
                    };
                }
            }
            */
     
        /* Interface IConvert */
     
            @Override
            public String convertToJson(Object objet) {
                Gson gson = new Gson();
                String json = gson.toJson(objet);
                return json;
            }
            public String moshi_convertToJson(String tab[]) {
                // On crée un objet Moshi (intermédiaire de conversion)
                Moshi moshi = new Moshi.Builder().build();
                // On créer un adapter pour gérer la conversion du type de l'objet -> String[] içi
                JsonAdapter<String[]> jsonAdapter = moshi.adapter(String[].class);
                // On crée l'objet Json à partir de l'adapter
                String json_tab_idLastNove = jsonAdapter.toJson(tab);
                return json_tab_idLastNove;
            }
     
            @Override
            public Object convertToJava(String json_Obj) {
                Gson gson = new Gson();
                Object objet = gson.fromJson(json_Obj, new Object().getClass());
                return objet;
            }
            @Override   // compatible <API 18
            public JSONArray convertToJSONArray(String[] tab_string) {
                final JSONArray ja = new JSONArray();
                for (int i=0;i<tab_string.length;i++) {
                    ja.put(tab_string[i]);
                }
                return ja;
            }
    }

    2ème solution :
    - J'ai défini une class héritant d'asyntask
    - J'utilise une instance de cette class dans le Handler du RefreshSwipeLayout
    - J'obtiens un tournement infini de l'icone refresh (qui apparait lorsque je rafraichis ma liste par un swipe vers le bas)

    La class en question
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    package novtonrak.perstud.com.novtonrak.ressources.request_mysql;
     
     
    import android.os.AsyncTask;
     
    import java.io.IOException;
    import okhttp3.FormBody;
    import okhttp3.OkHttpClient;
    import okhttp3.Request;
    import okhttp3.RequestBody;
    import okhttp3.Response;
     
    /**
     * Created by HKS on 30/10/2016.
     * Class permettant de caractériser et créer ...
     */
     
    public class OkHttpHandler_PostIDTab extends AsyncTask<String, Void, String> {
     
        OkHttpClient client = new OkHttpClient();
        String tab_id_ln;
     
        public OkHttpHandler_PostIDTab(String tab) {
           this.tab_id_ln = tab;
        }
     
        @Override
        protected String doInBackground(String... params) {
     
            RequestBody formBody = new FormBody.Builder()
                    .add("tab_id", tab_id_ln)
                    .build();
            Request request = new Request.Builder()
                    .url(params[0]).post(formBody)
                    .build();
            try {
                Response response = client.newCall(request).execute();
                if (!response.isSuccessful())
                    throw new IOException("Unexpected code " + response.toString());
                return response.body().string();
     
            } catch (Exception e) {
            }
     
            return null;
        }
    }
    Le fragment qui utilise la class
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    package novtonrak.perstud.com.novtonrak;
     
    import android.content.Context;
    import android.net.Uri;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.os.Handler;
    import android.support.v4.app.Fragment;
    import android.support.v4.widget.SwipeRefreshLayout;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    import android.widget.Toast;
     
    import com.google.gson.Gson;
    import com.squareup.moshi.Json;
    import com.squareup.moshi.JsonAdapter;
    import com.squareup.moshi.Moshi;
    import com.squareup.moshi.ToJson;
     
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
     
    import java.io.File;
    import java.io.IOError;
    import java.io.IOException;
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.ExecutionException;
     
    import novtonrak.perstud.com.novtonrak.lastnove.IDLastNove;
    import novtonrak.perstud.com.novtonrak.lastnove.LastNove;
    import novtonrak.perstud.com.novtonrak.lastnove.LastNoveAdapterListener;
    import novtonrak.perstud.com.novtonrak.lastnove.LastNoveAdapter;
    import novtonrak.perstud.com.novtonrak.profil.Profil_LOCAL;
    import novtonrak.perstud.com.novtonrak.ressources.OnObject.IConvert;
    import novtonrak.perstud.com.novtonrak.ressources.request_mysql.OkHttpHandler_PostIDTab;
    import okhttp3.Cache;
    import okhttp3.Call;
    import okhttp3.Interceptor;
    import okhttp3.MediaType;
    import okhttp3.OkHttpClient;
    import okhttp3.Request;
    import okhttp3.RequestBody;
    import okhttp3.Response;
    import okio.BufferedSink;
    import okio.ByteString;
    import okio.GzipSink;
    import okio.Okio;
     
     
    public class tab1_LastNoveFragment extends Fragment implements LastNoveAdapterListener, SwipeRefreshLayout.OnRefreshListener, IConvert {
     
        // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
        private static final String ARG_PARAM1 = "param1";
        private static final String ARG_PARAM2 = "param2";
        // TODO: Rename and change types of parameters
        private String mParam1;
        private String mParam2;
     
        private SwipeRefreshLayout mySwipeRefreshLayout;
        private OnFragmentInteractionListener mListener;
        private LastNoveAdapter LLAdapter;
        private ListView list;
        private String[] tab_idlastnove={"#021", "#1032", "etc", "..."};  // id des lastnove affichés, à récupérer depuis le profil local
        private LastNove[] new20lastNoves=null;  // stocke les 20 prochains lastnove affiché
        private OkHttpClient client= null;   // On crée un objet OkHttpClient pour se connecter dans l'asyncTask
        private final Gson gson = new Gson();
        private static final String BASE_URL_LL = "http://192.168.1.5/services/getlastnove.php";
        private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
        public static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("text/x-markdown; charset=utf-8");
        private Cache cache;    // Permet de créer un cache pour les lecture/ecritures de flux(buffer) utilisés avec OkHttpClient
     
        public static int responseCode = 0;
        public static String responseString = "";
     
        public tab1_LastNoveFragment() {
            // Required empty public constructor
        }
     
        /**
         * Use this factory method to create a new instance of
         * this fragment using the provided parameters.
         *
         * @param param1 Parameter 1.
         * @param param2 Parameter 2.
         * @return A new instance of fragment tab1_LastNoveFragment.
         */
        public static tab1_LastNoveFragment newInstance(String param1, String param2) {
     
            tab1_LastNoveFragment fragment = new tab1_LastNoveFragment();
            Bundle args = new Bundle();
            args.putString(ARG_PARAM1, param1);
            args.putString(ARG_PARAM2, param2);
            fragment.setArguments(args);
            return fragment;
        }
     
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
     
            if (getArguments() != null) {
                mParam1 = getArguments().getString(ARG_PARAM1);
                mParam2 = getArguments().getString(ARG_PARAM2);
            }
            client = getClient();
        }
     
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                  Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            View view = inflater.inflate(R.layout.lastnove_main, container, false); // on recupere la view
            mySwipeRefreshLayout = (SwipeRefreshLayout)view.findViewById(R.id.swiperefresh_lastnove);   // on recupere le swiperefreshlayout
            list = (ListView)view.findViewById(R.id.ListView01);       // on recupere la list
     
            ArrayList<LastNove> listLastNove = LastNove.getAListOfLastNove();   // on recupere la liste de lastnove du layout
            LLAdapter = new LastNoveAdapter(getActivity(), listLastNove); // on declare un nouvel adapter sur la list
     
            LLAdapter.addListener(this);  // on declare un listenner sur les item de la list
            //mySwipeRefreshLayout.setEnabled(false); // a désactiver pour que les fct° de rafraichissement fonctionne // on désative le rafraishisement et on l'active dés que le 1er item de la list est visible
            list.setAdapter(LLAdapter);   // on applique un adapter sur la liste
     
            /* On récupère l'id du layout de la liste pour lui assigner un listenner de down-swipe refresh */
            mySwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
                @Override
                public void onRefresh() {
                    mySwipeRefreshLayout.setRefreshing(true);
                    ( new Handler()).postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            mySwipeRefreshLayout.setRefreshing(true);
                            // On fait le onRefresh içi ou on fait çà dans une async task
                            OkHttpHandler_PostIDTab handler = new OkHttpHandler_PostIDTab(moshi_convertToJson(tab_idlastnove));
                            String result = null;
                            try {
                                result = handler.execute(BASE_URL_LL).get();
                            } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            } catch (ExecutionException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                    }, 3000);
                }
            });
            mySwipeRefreshLayout.setOnRefreshListener(this);
     
            return view;
        }
     
     
        // TODO: Rename method, update argument and hook method into UI event
        public void onButtonPressed(Uri uri) {
            if (mListener != null) {
                mListener.onFragmentInteraction(uri);
            }
        }
        @Override
        public void onAttach(Context context) {
            Log.w("LAstNoveFrag", "OnAttachCalled");
            super.onAttach(context);
            if (context instanceof OnFragmentInteractionListener) {
                mListener = (OnFragmentInteractionListener) context;
            } else {
                throw new RuntimeException(context.toString()
                        + " must implement OnFragmentInteractionListener");
            }
        }
        @Override
        public void onDetach() {
            super.onDetach();
            mListener = null;
        }
     
        @Override
        public void onClickButtonImage(LastNove item, int position) {
     
        }
        @Override
        public void onClickItemLayout(LastNove item, int position) {
     
        }
     
     
        /* Procédure onRefresh de swiperefreshlayout */
        @Override
        public void onRefresh() {
            /* 1ere requête : Envoie du tableau d'DI */
            try {
                sendTab(BASE_URL_LL, tab_idlastnove);
            } catch (IOError ioError) {
                Log.e("erreur IOError",ioError.getMessage());
            } catch (IOException io) {
                Log.e("erreur IOException",io.getMessage());
            }
     
           /* 2eme requête : Requete des 20 derniers LastNove
           try {
            get20NewLL(BASE_URL_LL);
            } catch (IOError ioError) {
                Log.e("erreur IOError",ioError.getMessage());
            } catch (IOException io) {
                Log.e("erreur IOException",io.getMessage());
            }*/
        }
     
        /* AsyncTask OkHttpClient pour récupérer les 20derniers last nove excepté lastnove ayant pour id les même que ceux déja affiché */
     
         /* Procédures/Fonctions OkHttpClient */
     
            /* Créer et retourne un client OkHttpClient(pour se connecter) et lui assigne un ' fichier de cache ' */
            private  OkHttpClient getClient(){
                if(client==null) {
                    //Assigning a CacheDirectory
                    File myCacheDir = new File(getContext().getCacheDir(), "OkHttpCache");
                    //you should create it...
                    int cacheSize = 1024 * 1024;
                    Cache cacheDir = new Cache(myCacheDir, cacheSize);
                    client = new OkHttpClient.Builder()
                            .cache(cacheDir)
                            //.addInterceptor(getInterceptor()) // on ajoute un interceptor pour intercepter les requêtes et pouvoir faire du log
                            //.addInterceptor(new GzipRequestInterceptor()) // on ajoute un interceptor pour compresset le flux entrant et sortant pour economie de BP
                            .build();
                }
     
                //now it's using the cache
                return client;
            }
     
     
            /*public Interceptor getInterceptor() {
                return new LoggingInterceptor();
            }
            */
            /* Interceptor pour les requetes */
            /*class LoggingInterceptor implements Interceptor {
                //Code pasted from okHttp webSite itself
                @Override
                public Response intercept(Chain chain) throws IOException {
                    Request request = chain.request();
                    long t1 = System.nanoTime();
                    Log.e("Interceptor Sample", String.format("Sending request %s on %s%n%s",
                            request.url(), chain.connection(), request.headers()));
     
                    Response response = chain.proceed(request);
     
                    long t2 = System.nanoTime();
                    Log.e("Interceptor Sample", String.format("Received response for %s in %.1fms%n%s",
                            response.request().url(), (t2 - t1) / 1e6d, response.headers()));
     
                    return response;
                }
            }
            */
            /* This interceptor compresses the HTTP request body. Many webservers can't handle this! */
        /*
            final class GzipRequestInterceptor implements Interceptor {
                @Override
                public Response intercept(Chain chain) throws IOException {
                    Request originalRequest = chain.request();
                    if (originalRequest.body() == null
                            || originalRequest.header("Content-Encoding") != null) {
                        return chain.proceed(originalRequest);
                    }
     
                    Request compressedRequest = originalRequest.newBuilder()
                            .header("Content-Encoding", "gzip")
                            .method(originalRequest.method(), gzip(originalRequest.body()))
                            .build();
                    return chain.proceed(compressedRequest);
                }
                private RequestBody gzip(final RequestBody body) {
                    return new RequestBody() {
                        @Override
                        public MediaType contentType() {
                            return body.contentType();
                        }
     
                        @Override
                        public long contentLength() {
                            return -1; // We don't know the compressed length in advance!
                        }
     
                        @Override
                        public void writeTo(BufferedSink sink) throws IOException {
                            BufferedSink gzipSink = Okio.buffer(new GzipSink(sink));
                            body.writeTo(gzipSink);
                            gzipSink.close();
                        }
                    };
                }
            }
            */
     
        /* Interface IConvert */
     
            @Override
            public String convertToJson(Object objet) {
                Gson gson = new Gson();
                String json = gson.toJson(objet);
                return json;
            }
            public String moshi_convertToJson(String tab[]) {
                // On crée un objet Moshi (intermédiaire de conversion)
                Moshi moshi = new Moshi.Builder().build();
                // On créer un adapter pour gérer la conversion du type de l'objet -> String[] içi
                JsonAdapter<String[]> jsonAdapter = moshi.adapter(String[].class);
                // On crée l'objet Json à partir de l'adapter
                String json_tab_idLastNove = jsonAdapter.toJson(tab);
                return json_tab_idLastNove;
            }
     
            @Override
            public Object convertToJava(String json_Obj) {
                Gson gson = new Gson();
                Object objet = gson.fromJson(json_Obj, new Object().getClass());
                return objet;
            }
            @Override   // compatible <API 18
            public JSONArray convertToJSONArray(String[] tab_string) {
                final JSONArray ja = new JSONArray();
                for (int i=0;i<tab_string.length;i++) {
                    ja.put(tab_string[i]);
                }
                return ja;
            }
    }
    A force de passer en revue des tutos et autres explications, je me suis rendu compte que je faisais mon traitement dans onCreateView et pas dans le onCreate().
    Mais j'ai défini le "OnRefreshListener" du swipeLayout dans onCreateView() et donc ... je suis encore bloqué dans la nuit ...

  7. #7
    Modérateur
    Avatar de MasterMbg
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 719
    Par défaut
    Bonjour,

    D'après le TUTO, OKIO est utilisé pour la lecture et l'écriture facile des fichiers et des flux. Pour envoyer des requêtes au serveur tu devrais plutôt utiliser OkHttp 3.0 ou soit Retrofit 2.0. Il y a aussi Volley qui est pas mal du tout.

    Citation Envoyé par vertebre Voir le message
    Seul bémol, et je n'en suis pas sur, c'est que si j'utilise OKIO pour faire ma requête et passer mon String[] au php je n'utilise pas d'AyncTask ?
    Non, car ce que tu ferais avec AsyncTask, OkHttp 3.0 le fait déjà pour pour toi. Tu dois savoir que AsyncTask ne permet pas de faire des requêtes au serveur. Son rôle se résume à l'exécution des tâches dans un thread autre que le main (Thread principal gérant entre autres les interactions avec l'utilisateur, création des views...). Quand tu passes une requête à OkHttp 3.0, il crée pour toi un thread dans lequel il exécute ta requête. Voilà un peu la différence.

    Pour résumer, si tu utilises OkHttp 3.0 pour envoyer des requêtes au serveur tu n'as nullement besoin de mettre sur pied un AsyncTask.


    Christian Djo,
    Plus tu apprends sérieusement, plus tu te rapproches d'un savoir noble. Une chose est certaine, les difficultés ne s'écarteront de ton chemin...

    Tu es nouveau dans le développement Android, la page des COURS est là pour te faciliter la vie
    Tu peux trouver la réponse à ta question dans la FAQ
    Retrouvez mon tutoriel sur la consommation des services web SOAP
    Pense à voter positivement en appuyant sur en bas à droite de la réponse qui t'a donné une piste de solution.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/06/2015, 22h24
  2. Réponses: 8
    Dernier message: 06/03/2008, 16h32
  3. [Débutant] Problème avec les paramètres d'une proc stockée
    Par babulior dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 28/06/2005, 15h38
  4. [Débutant] Pb avec les paramètres dans lien dynamique
    Par hackwell69 dans le forum Struts 1
    Réponses: 2
    Dernier message: 21/02/2005, 11h33
  5. Problème avec les paramètres date BDE/ODBC Oracle/XP Pro
    Par Bloon dans le forum Bases de données
    Réponses: 3
    Dernier message: 06/10/2004, 10h09

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