DevCorner: Lezione 1 - Richieste asincrone e parsing XML [FeedReader]

Giuseppe Tripodi
Giuseppe Tripodi Tech Master
DevCorner: Lezione 1 - Richieste asincrone e parsing XML [FeedReader]

Due martedì fa ci siamo cimentati nella progettazione di un feed reader,  che sarà una delle due applicazioni complete che realizzeremo qui nel DevCorner nei prossimi mesi. Per le letture sotto l'ombrellone dovrete ancora ripiegare sulle vostre app di fiducia, ma oggi facciamo un piccolo passo avanti nella nostra opera!

Come introdotto dal titolo, nella prima parte del progetto che potete già scaricare (o forkare!) dall'apposita repo Github, troverete i primi due step realizzati, che si concretizzano in una chiamata asincrona al sito di cui vogliamo ottenere i feed (vi lasciamo la suspance sulla scelta del portale!) e in un primo abbozzo di parsing dell'XML.

La settimana scorsa Roberto ha mostrato come realizzare una chiamata asincrona tramite la classe nativa AsyncTask, ma visto che sarebbe inutile ripetersi  e che io sono decisamente il più pigro degli sviluppatori ho riposto ancora una volta i miei problemi nelle mani di LoopJ, che con la sua libreria AsyncHTTPClient sa come affrontarli al meglio.


Dopo averla integrata nel progetto tramite il file build.gradle creiamo una classe chiamata ConnectionHelper, che contiene tutti i metodi necessari per interfacciarci con il web.
Per scelta programmatica ho preferito applicare il pattern singleton alla suddetta classe, in modo che venga generata un'unica istanza della stessa.

public class ConnectionHelper {

    private static ConnectionHelper cHelper = null;

    private static AsyncHttpClient client;

    private ConnectionHelper(){
         client = new AsyncHttpClient();
    }

    public static ConnectionHelper getInstance(){
        if(cHelper == null)
        {
            cHelper = new ConnectionHelper();
        }
        return cHelper;
    }

        private final String BASE_URL = "https://www.androidworld.it/";

        public void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
            client.get(getAbsoluteUrl(url), params, responseHandler);
        }

        public void post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
            client.post(getAbsoluteUrl(url), params, responseHandler);
        }

        private String getAbsoluteUrl(String relativeUrl) {
            return BASE_URL + relativeUrl;
        }

    }

Adesso che abbiamo il nostro client HTTP possiamo creare velocemente una classe che modelli un articolo, che ovviamente non mancherà di avere:

  • Titolo
  • Autore
  • Data di publicazione
  • Link
  • Introduzione
  • Contenuto

Fatto questo (non dimenticando ovviamente i getter e i setter!) non ci resta (per il momento!) che dedicarci alla creazione di un semplice parser XML.

Creiamo quindi una classe che per il momento ha un unico metodo statico parseXML: pendendo ispirazione dalla guida ufficiale di Google e da alcuni esempi trovati su StackOverflow è quasi elementare realizzare un semplice parser che scorra gli elementi (item) e ne tiri fuori titolo, autore e quant'altro.

Per questa settimana l'appuntamento si conclude qui: per adesso tutto ciò che abbiamo sono dei log che testimoniano che stiamo effettivamente leggendo i feed di AndroidWorld, ma vedrete che da qui a realizzare un'applicazione realmente funzionante non ci vorrà poi molto!