113 votes

Android client reste, échantillon ?

Même si ce fil a accepté de répondre, n'hésitez pas à proposer d'autres idées, vous utilisez ou comme


J'ai rencontré ces articles:

Et qui m'amènent à cette Google I/O 2010 video sur le REPOS des applications clientes

Depuis, j'ai été la création de REPOS composant en tant que composante statique dans mon Application de contrôleur de classe.

À partir de maintenant, je pense que je devrais changer le modèle. Quelqu'un a souligné que Google IOSched application est un grand exemple de la façon d'écrire de REPOS clients sur Android. Quelqu'un d'autre a dit que cette manière est trop trop compliqué.

Donc, quelqu'un peut-il svp nous indiquer quelle est la meilleure pratique? En bref et simple.
Le IOSched demande est trop complexe pour des exemples de cas d'utilisation.

96voto

curioustechizen Points 4841

EDIT:

L'original de la réponse est plus d'un an et demi d'existence au moment de cette édition. Bien que les concepts présentés dans la réponse originale à cette question encore de les tenir, comme d'autres réponses point, il y a maintenant des bibliothèques que de rendre cette tâche plus facile pour vous. Plus important encore, certains de ces bibliothèques poignée de configuration de l'appareil changements pour vous.

L'original de la réplique est maintenu en dessous pour référence. Mais s'il vous plaît prendre le temps d'examiner le Reste des bibliothèques clientes pour Android pour voir si elles correspondent à votre cas d'utilisation. Ce qui suit est une liste de certains des bibliothèques, j'ai évalué. Il n'est pas destiné à être une liste exhaustive.


Réponse Originale À Cette Question:

Présentation de mon approche de REPOS clients sur Android. Je ne prétendons pas que c'est le meilleur :) notez Également que c'est ce que j'ai trouvé de réponse à ma demande. Vous pourriez avoir besoin d'avoir plusieurs calques/ajouter plus de complexité si votre cas l'exige. Par exemple, je n'ai pas de local de stockage à tous; parce que mon application peut tolérer la perte d'un peu de REPOS réponses.

Mon approche n'utilise qu' AsyncTasks sous les couvertures. Dans mon cas, j'ai "appel" de ces Tâches à partir de mon Activity exemple; mais pleinement compte pour les cas comme la rotation de l'écran, vous pouvez choisir de les appeler à partir d'un Service ou tel.

J'ai consciemment choisi mon REPOS client lui-même à une API. Cela signifie, que l'application qui utilise mon REPOS client n'a même pas besoin d'être conscient de la réelle RESTE de l'URL et le format de données utilisé.

Le client aura de 2 couches:

  1. Couche supérieure: Le but de cette couche est de fournir des méthodes qui reflètent la fonctionnalité de l'API REST. Par exemple, vous pourriez avoir une méthode Java correspondant à chaque URL dans votre API REST (ou même les deux en un " pour les Obtient et un pour les Poteaux).
    C'est le point d'entrée dans le RESTE de l'API client. C'est la couche de l'application serait de l'utiliser normalement. Il pourrait être un singleton, mais pas nécessairement.
    La réponse de l'appel RESTE est analysé par cette couche dans un POJO et est retourné à l'application.

  2. Ce qui est le plus bas niveau AsyncTask de la couche, qui utilise le client HTTP méthodes de sortir et de faire appel RESTE.

En outre, j'ai choisi d'utiliser un mécanisme de Rappel à communiquer les résultats de l' AsyncTasks retour à l'app.

Assez de texte. Nous allons voir le code maintenant. Permet de prendre un hypothétique API REST URL http://myhypotheticalapi.com/user/profile

La couche supérieure peut ressembler à ceci:

   /**
 * Entry point into the API.
 */
public class HypotheticalApi{   
    public static HypotheticalApi getInstance(){
        //Choose an appropriate creation strategy.
    }

    /**
     * Request a User Profile from the REST server.
     * @param userName The user name for which the profile is to be requested.
     * @param callback Callback to execute when the profile is available.
     */
    public void getUserProfile(String userName, final GetResponseCallback callback){
        String restUrl = Utils.constructRestUrlForProfile(userName);
        new GetTask(restUrl, new RestTaskCallback (){
            @Override
            public void onTaskComplete(String response){
                Profile profile = Utils.parseResponseAsProfile(response);
                callback.onDataReceived(profile);
            }
        }).execute();
    }

    /**
     * Submit a user profile to the server.
     * @param profile The profile to submit
     * @param callback The callback to execute when submission status is available.
     */
    public void postUserProfile(Profile profile, final PostCallback callback){
        String restUrl = Utils.constructRestUrlForProfile(profile);
        String requestBody = Utils.serializeProfileAsString(profile);
        new PostTask(restUrl, requestBody, new RestTaskCallback(){
            public void onTaskComplete(String response){
                callback.onPostSuccess();
            }
        }).execute();
    }
}


/**
 * Class definition for a callback to be invoked when the response data for the
 * GET call is available.
 */
public abstract class GetResponseCallback{

    /**
     * Called when the response data for the REST call is ready. <br/>
     * This method is guaranteed to execute on the UI thread.
     * 
     * @param profile The {@code Profile} that was received from the server.
     */
    abstract void onDataReceived(Profile profile);

    /*
     * Additional methods like onPreGet() or onFailure() can be added with default implementations.
     * This is why this has been made and abstract class rather than Interface.
     */
}

/**
 * 
 * Class definition for a callback to be invoked when the response for the data 
 * submission is available.
 * 
 */
public abstract class PostCallback{
    /**
     * Called when a POST success response is received. <br/>
     * This method is guaranteed to execute on the UI thread.
     */
    public abstract void onPostSuccess();

}

Notez que l'application ne permet pas d'utiliser le JSON ou XML (ou tout autre format) retourné par l'API REST directement. Au lieu de cela, l'application ne voit que le haricot Profile.

Ensuite, la couche inférieure (AsyncTask couche) pourrait ressembler à ceci:

/**
 * An AsyncTask implementation for performing GETs on the Hypothetical REST APIs.
 */
public class GetTask extends AsyncTask<String, String, String>{

    private String mRestUrl;
    private RestTaskCallback mCallback;

    /**
     * Creates a new instance of GetTask with the specified URL and callback.
     * 
     * @param restUrl The URL for the REST API.
     * @param callback The callback to be invoked when the HTTP request
     *            completes.
     * 
     */
    public GetTask(String restUrl, RestTaskCallback callback){
        this.mRestUrl = restUrl;
        this.mCallback = callback;
    }

    @Override
    protected String doInBackground(String... params) {
        String response = null;
        //Use HTTP Client APIs to make the call.
        //Return the HTTP Response body here.
        return response;
    }

    @Override
    protected void onPostExecute(String result) {
        mCallback.onTaskComplete(result);
        super.onPostExecute(result);
    }
}

    /**
     * An AsyncTask implementation for performing POSTs on the Hypothetical REST APIs.
     */
    public class PostTask extends AsyncTask<String, String, String>{
        private String mRestUrl;
        private RestTaskCallback mCallback;
        private String mRequestBody;

        /**
         * Creates a new instance of PostTask with the specified URL, callback, and
         * request body.
         * 
         * @param restUrl The URL for the REST API.
         * @param callback The callback to be invoked when the HTTP request
         *            completes.
         * @param requestBody The body of the POST request.
         * 
         */
        public PostTask(String restUrl, String requestBody, RestTaskCallback callback){
            this.mRestUrl = restUrl;
            this.mRequestBody = requestBody;
            this.mCallback = callback;
        }

        @Override
        protected String doInBackground(String... arg0) {
            //Use HTTP client API's to do the POST
            //Return response.
        }

        @Override
        protected void onPostExecute(String result) {
            mCallback.onTaskComplete(result);
            super.onPostExecute(result);
        }
    }

    /**
     * Class definition for a callback to be invoked when the HTTP request
     * representing the REST API Call completes.
     */
    public abstract class RestTaskCallback{
        /**
         * Called when the HTTP request completes.
         * 
         * @param result The result of the HTTP request.
         */
        public abstract void onTaskComplete(String result);
    }

Voici comment une application peut utiliser l'API (en Activity ou Service):

HypotheticalApi myApi = HypotheticalApi.getInstance();
        myApi.getUserProfile("techie.curious", new GetResponseCallback() {

            @Override
            void onDataReceived(Profile profile) {
                //Use the profile to display it on screen, etc.
            }

        });

        Profile newProfile = new Profile();
        myApi.postUserProfile(newProfile, new PostCallback() {

            @Override
            public void onPostSuccess() {
                //Display Success
            }
        });

J'espère que les commentaires sont suffisantes pour expliquer la conception de; mais je serais heureux de vous fournir plus d'informations.

11voto

ChrLipp Points 6445

"Le développement d'Android RESTE des applications client" par Virgil Dobjanschi conduit à beaucoup de discussions, car aucun code source n'a été présenté pendant la session ou par la suite.

La seule référence de mise en œuvre de ce que je sais (merci de commenter si vous en savez plus) est disponible à Datadroid (la Google IO session est mentionné sous /présentation). C'est une bibliothèque qui vous pouvez utiliser dans votre propre application.

Le second lien demande pour le "meilleur" RESTE du cadre, ce qui est discuté lourdement sur stackoverflow. Pour moi, la taille de l'application est importante, suivie par la performance de la mise en œuvre.

  • Normalement, j'utilise la plaine org.json mise en, qui fait partie d'Android depuis l'API de niveau 1 et, par conséquent, de ne pas augmenter la taille de l'application.
  • Pour moi très intéressant, c'est l'information qui se trouve sur JSON analyseurs de performances dans les commentaires: comme d'Android 3.0 Honeycomb, GSON de streaming analyseur est inclus comme android.util.JsonReader. Malheureusement, les commentaires ne sont pas plus disponibles.
  • Printemps Android (que j'utilise parfois) prend en charge Jackson et GSON. Le Printemps Android RestTemplate documentation du Module points pour un exemple d'application.

Donc je m'en tiens à org.json ou GSON pour complexer les scénarios. Pour l'architecture d'un org.json mise en œuvre, je suis en utilisant une classe statique qui représente le serveur cas d'utilisation (par exemple, findPerson, getPerson). J'appelle cette fonctionnalité à partir d'un service et d'utilisation de l'utilitaire de classes qui sont en train de faire la cartographie (projet spécifique) et le réseau IO (ma propre RESTE modèle ordinaire GET ou POST). J'essaie d'éviter l'usage de la réflexion.

7voto

Pcriulan Points 249

N'utilisez jamais de AsynTask pour effectuer la demande de réseau ou n'importe quoi qui doivent être conservés. Async Task sont fortement liés à votre activité et si l'utilisateur de changer l'orientation de l'écran étant donné que l'App est de nouveau créé l'AsyncTask sera arrêté.

Je vous suggère d'utiliser les Services de modèle avec l'Intention de Services et ResultReceiver. Jetez un oeil à RESTDroid. C'est une bibliothèque qui vous permet d'effectuer tout type de REPOS demande de manière asynchrone et informez-en votre INTERFACE utilisateur avec Demande Auditeurs de la mise en œuvre de l'Virgile Dobjanschi de service du modèle.

3voto

Arthur Points 224

Il y a une autre bibliothèque avec beaucoup plus propre API et les données de type sécurisé. https://github.com/kodart/Httpzoid

Voici un exemple d’utilisation simple

Ou plus complexe avec des rappels

C’est frais, nouveau, mais semble très prometteur.

1voto

Manu Points 21

Avertissement: je suis impliqué dans le rest2mobile projet open source

Une autre alternative que d'un client REST est d'utiliser rest2mobile.

L'approche est légèrement différente, car il utilise le béton reste des exemples pour générer le code du client pour le service REST. Le code remplace l'URL REST et JSON charges avec java natif des méthodes et des objets Pojo. Elle aussi s'occupe automatiquement des connexions au serveur asynchrone des invocations et des POJO vers/à partir de JSON conversions.

Notez que cet outil vient en différentes saveurs (cli, plugins, android/ios/js) et vous pouvez utiliser l' android studio plugin pour générer de l'API directement dans votre application.

Tout le code est disponible sur github ici.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X