Android:dynamiquement passer de la classe du modèle de modernisation de rappel
Dans une rénovation de la carte réponse json pour pojo habituellement nous faire
@POST
Call<User> getDataFromServer(@Url String url, @Body HashMap<String,Object> hashMap);
ApiCalls api = retrofit.create(ApiCalls.class);
Call<User> call = api.getDataFromServer(StringConstants.URL,hashMap);
call.enqueue(new Callback<User>() {
//Response and failure callbacks
}
où l'Utilisateur est ma classe Pojo.
Mais pour tout autre demande, j'ai besoin de faire différentes pojo et écrire le même code pour la rénovation d'appel.Je veux faire une méthode unique pour l'appel de l'api et adopter un projet de classe pojo de modernisation de l'appel. comme ce
ApiCalls api = retrofit.create(ApiCalls.class);
Call<*ClassPassed*> call = api.getDataFromServer(StringConstants.URL,hashMap);
call.enqueue(new Callback<*ClassPassed*>() {
//Response and failure callbacks
}
alors maintenant, je peux tout de classe pojo de méthode unique et obtenir une réponse.C'est juste pour éviter d'avoir à réécrire le même code encore et encore.est-ce possible
Mise à jour
Pour donner plus de détails:
Suppose que j'ai besoin de faire deux demandes. La première consiste à obtenir userDetails et l'autre est patientDetails.J'ai donc créer deux classes de modèle de l'Utilisateur et le Patient.
Donc, dans la rénovation de l'api, je vais avoir quelque chose comme ceci
@POST
Call<User> getDataFromServer(@Url String url, @Body HashMap<String,Object> hashMap);
@POST
Call<Patient> getDataFromServer(@Url String url, @Body HashMap<String,Object> hashMap);
et dans mon FragmentUser et FragmentPatient classe je vais faire ce
ApiCalls api = retrofit.create(ApiCalls.class);
Call<User> call = api.getDataFromServer(StringConstants.URL,hashMap);
call.enqueue(new Callback<User>() {
//Response and failure callbacks
}
ApiCalls api = retrofit.create(ApiCalls.class);
Call<Patient> call = api.getDataFromServer(StringConstants.URL,hashMap);
call.enqueue(new Callback<Patient>() {
//Response and failure callbacks
}
mais ici, le code est repaeting seulement en raison de différentes classes pojo.J'ai besoin de répéter le même code dans tous les autres fragments de différentes demandes.
J'ai donc besoin de faire une méthode générique où il peut accepter n'importe quel classe pojo et puis, à partir de fragment, je vais être juste de passage de la pojo être mappés.
la question, veuillez vérifier.
un coup d'oeil sur la réponse , je pense que cela vous aidera ....
OriginalL'auteur Android jack - Rajesh Gosemath | 2016-12-01
Vous devez vous connecter pour publier un commentaire.
Il y a 2 façons dont vous pouvez faire cette .........
1. Les génériques
2. Combiner tous les POJO dans un ......
Dans les Génériques, vous devez passer à la méthode avec la classe. moyens un coup d'oeil sur l'exemple .....
REMARQUE:- au-Dessus de rénovation appel Transtypage de votre réponse en
YOUR OBJECT
, de sorte que vous pouvez accéder à son champ et les méthodesIl est très facile à utiliser . Vous devez combiner vos tous de classe POJO en un seul et de les utiliser à l'intérieur de la Rénovation. svp un coup d'oeil sur l'exemple ci-dessous ....
Login API-je obtenir de réponse JSON comme ça ...
ci-dessus JSON , POJO ressembler à ceci
et de la Modernisation d'appel ressembler à ceci .....
De l'Utilisateur de l'API-je obtenir de réponse JSON comme ça ...
ci-dessus JSON , POJO ressembler à ceci
et de la Modernisation d'appel ressembler à ceci .....
Il vous suffit de combiner les deux au-dessus de réponse JSON en un seul .....
et l'utilisation de Résultat à l'intérieur de Votre appel d'API ......
Remarque:- Vous directement combiner vos 2 classe POJO, et y accéder. (C'est très compliquer si vous avez la réponse très grande, et de fournir la duplication si certains la CLÉ est de même avec les différents type de Variable )
vous êtes les bienvenus
OriginalL'auteur Sushil Kumar
Vous pouvez construire des principaux pojo comme ce
Et de l'appeler comme ça
exactement ce que vous voulez savoir
J'ai même scénario que la vôtre réponse est de pointage, mais je suis incapable de créer le service et l'Interface pour modèle dynamique.
Appel<BaseResponse<T>> mettre le nom du modèle à la place de T
est donne cette erreur: github.com/square/retrofit/issues/2012
OriginalL'auteur Surya Prakash Kushawah
D'Abord Créer L'Interface:
Maintenant créer une classe:
Maintenant dans toute activité suffit d'utiliser:
J'utilise dans mon application. Et je n'ai pas de méthode optimisée de le faire
comment puis-je utiliser le pattern singleton pour l'utilisation de apiclient classe?
Si vous comprenez le pattern singleton, alors
if (null != retrofit) return retrofit;
d'autre, que d'autres choses à créer le clientAh vous faites déjà de l'null vérifier sur
retrofit
il suffit de déplacer l'instanciation de okhttp constructeur de la classe à l'intérieur du bloc siOriginalL'auteur Divyesh Patel
Mon approche, c'est de faire un POJO appelé ResponseData dans lequel vous aurez un attribut de l'Objet, de façon à avoir:
Lorsque vous obtenez la réponse, vous devez analyser votre réponse.corps() de la classe désirée. Donc les pros: il vous suffit une seule demande, au lieu de cela, vous devez analyser la réponse.
OriginalL'auteur Josué de León Santana
De faire comme ceci :
OriginalL'auteur Sahil Munjal
Afin de généraliser ce que vous voulez, vous pouvez simplement sérialiser vos POJO, et alors vous pouvez simplement passer votre POJO de la méthode.
lorsque vous sérialiser avec des Objets essentiellement, il la convertit en chaîne de caractères, qui sont par la suite convertis à une grande Chaîne Json, qui sont plus faciles à transférer et à manipuler.
Un exemple rapide serait:
exemple POJO la mise en œuvre de la sérialisation, ici, vous devez assurez-vous que les chaînes de la
Map<String,Object>
correspondent à ce que le serveur s'attend à obtenir, et cette méthode doit être différent dans chaque POJO:La sérialisation de l'interface (de sorte que vous pouvez la mettre en œuvre à travers d'autres objets Pojo)
Et un parser Json vous shoul probablement de toute façon:
Et le dernier, votre API définition:
Et de la méthode, qui doit s'asseoir dans une catégorie générale qui gère vos demandes:
Je retourne la réponse au moyen d'un auditeur, c'est un exemple de ce que vous pouvez faire en fonction de votre réponse.
Espérons que cette aide!
OriginalL'auteur TommySM
Vous devez utiliser des génériques. De cette façon, vous pouvez passer le type souhaité dans l'appel.
En passant, je ne suis pas un expert en rénovation (j'utilise mes propres trucs pour la plupart), mais je pense que vous l'utilisez mal.
OriginalL'auteur Fco P.
Utilisation standard des génériques, avec un peu de piratage autour de
Définir votre interface comme ceci
et appel à la création d'api client d'utiliser une méthode d'aide
Mais malgré le fait, combien de fois il a été dit ici, je vais le dire encore une fois... ne le faites pas .., Vous renoncez à tout type de sécurité et à la validation du contrat qui Rénover offre .. C'est en fait la chose la plus passionnante à ce sujet..
OriginalL'auteur koperko
Je utiliser l'approche suivante:
D'abord j'ai mis en œuvre personnalisée Appel
Il wrappes
Call<Tin>
et les convertit en d'<Tout>
par le convertisseur.Pour votre service, vous devez créer d'interface de service, que le retour JsonObject pour objet unique et JsonArray pour les tableaux
Puis l'envelopper avec une classe générique, avec des convertisseurs de JsonElement à tout Type
<T>
:GenericListType est ParaterizedType. Il est utilisé pour le passage de paramètre de type de gson pour
List<T>
Ensuite, vous pouvez instancier
ApiCallsGeneric
avec le type que vous voulez.OriginalL'auteur Tselofan
à l'aide de JsonElement en Réponse:
OriginalL'auteur Irfan Ul Haq