Вы находитесь на странице: 1из 4

23/11/2014

LeyendoservicioswebdesdeAndroid:JSON|Nosinmiubuntu|Ubuntuenconcreto,GNU/Linuxengeneral

LeyendoservicioswebdesdeAndroid:JSON
1defebrerode2012por3pies

Buenas, estas dos semanas anteriores vimos como instalar en Ubuntu un entorno de
desarrollo para PHP y MySQL y luego creamos nuestro primer servicio web para poder
leerlo desde cualquier dispositivo (Android, IPhone, otro sitio web...). La semana pasada nos
qued pendiente ver como utilizar este servicio web en una aplicacin Android, as que vamos
all.

Enelejerciciodeestasemanaloquevamosahaceresconectarnosanuestroservidor,leeremosyparsearemos
elJSONquenosdevuelvayporltimologuardaremosenbasededatosennuestrodispositivo.

Paralosquenotenisunservidordonderealizarlaspruebasnoospreocupis,convuestrodispositivoyunrouter
wifipodisprobarlosinproblema.
Empezamos. Lo primero que haremos es abrir Eclipse. En un proyecto nuevo crearemos una nueva clase
llamadaJSONManagerlacualvaatenerelsiguientemtodostaticypublic:

publicstaticJSONObjectgetJSONfromURL(Stringurl){
InputStreamis=null
Stringresult=""
JSONObjectjson=null
try{
HttpClienthttpclient=newDefaultHttpClient()
HttpPosthttppost=newHttpPost(url)
HttpResponseresponse=httpclient.execute(httppost)
HttpEntityentity=response.getEntity()
is=entity.getContent()
}catch(Exceptione){}
try{
BufferedReaderreader=newBufferedReader(newInputStreamReader(is,"iso88591"),8)
StringBuildersb=newStringBuilder()
Stringline=null
while((line=reader.readLine())!=null){
sb.append(line+"\n")
}
is.close()
result=sb.toString()
}catch(Exceptione){}
try{
json=newJSONObject(result)
data:text/htmlcharset=utf8,%3Cheader%20class%3D%22entryheader%22%20style%3D%22display%3A%20block%3B%20color%3A%20rgb(55%2C%2055

1/4

23/11/2014

LeyendoservicioswebdesdeAndroid:JSON|Nosinmiubuntu|Ubuntuenconcreto,GNU/Linuxengeneral

}catch(JSONExceptione){}
returnjson
}

El mtodo se conectar a la URL que le indiquemos y tratar de leer y parsear la respuesta en un objeto
JSONObject. La primera parte del mtodo abre la conexin http y obtiene la respuesta en un InputStream. La
segunda parte, lee la respuesta y la parsea con un objeto BufferedReader para poder finalmente pasarla a
unString. Este String es necesario en la tercera parte para crear un nuevo objeto JSONObject que ser lo que
vamosadevolverfinalmente.

Para la siguiente parte creamos una nueva clase, la cual voy a llamar JSONParserLibros. Esta clase se va a
encargardeleerelservicioayudadodelmtodoanterioryguardarenbasededatos.Veamosqueesloquehace.

privateActivityactivity
privateJSONObjectjObject
privateProgressDialogprogressDialog=null
privateRunnablerunReadAndParseJSON
publicJSONParserLibros(Activitya){
activity=a
}
publicvoidreadAndParseJSONLibros()throwsJSONException{
runReadAndParseJSON=newRunnable(){
@Override
publicvoidrun(){
try{
readJSONLibros()
}catch(Exceptione){}
}
}
Threadthread=newThread(null,runReadAndParseJSON,"bgReadJSONLibros")
thread.start()
progressDialog=ProgressDialog.show(activity,"Descargandoinformacin","Porfavorespere",true)
}
privatevoidreadJSONLibros()throwsJSONException{
jObject=JSONManager.getJSONfromURL("http://192.168.1.87/android/service.libros.php")
if(jObject!=null)
parseJSONLibros(jObject.getJSONArray("libros"))
activity.runOnUiThread(returnRes)
}
privatevoidparseJSONLibros(JSONArraylibrosArray)throwsJSONException{
for(inti=0i<librosArray.length()i++){
Librol=newLibro()
data:text/htmlcharset=utf8,%3Cheader%20class%3D%22entryheader%22%20style%3D%22display%3A%20block%3B%20color%3A%20rgb(55%2C%2055

2/4

23/11/2014

LeyendoservicioswebdesdeAndroid:JSON|Nosinmiubuntu|Ubuntuenconcreto,GNU/Linuxengeneral

l.setIdLibro(librosArray.getJSONObject(i).getInt("id"))
l.setTitulo(librosArray.getJSONObject(i).getString("libro"))
l.setISBN(librosArray.getJSONObject(i).getString("isbn"))
l.save(activity)
}
}
privateRunnablereturnRes=newRunnable(){
@Override
publicvoidrun(){
progressDialog.dismiss()
}
}

Como veis, tiene bastantes mtodos, vamos a ver que hace cada uno. Lo primero que nos encontramos son
variablesyelcontructordelaclase.
A

continuacin

tenemos

el

mtodo

pblico

que

utilizaremos

para

llamar

nuestro

servicioreadAndParseJsonLibros.Estemtodocreaunnuevohilodeejecucindentrodelcualsevaahacerla
llamadaalservicioweb,ademsseiniciaunaventanadedialogoqueavisaralusuarioqueseesthaciendouna
descarga.
Larazndehacerloenunhilodeejecucindiferenteesporqueesteesunprocesoasncronoquevaadepender
dediferentesfactorescomolavelocidaddelaconexinodeloquetardeenresponderelservidor.
ElsiguientemtodoreadJsonLibrosesprivate,yvaaobtenerelobjetoJSONresultantedelallamadaanuestro
servicio web mediante el mtodo de la clase JSONMananger. Lo que hacemos a continuacin es buscar el array
de objetos json incluido dentro de libros. Aqu lo que vamos a tener es cada uno de los objetos json libro. Por
ltimo, se llama a un objeto Runnable definido al final de la clase que lo que va a hacer es cerrar la ventana de
dilogo.

Comoveis,hepuestounaIPdeunaredlocalparahacerlallamadaalservicio,estacorrespondealequipodonde
hedesarrolladoelservicioweb.Enelmomentodeprobaresto,siteneisunrouterwifi,deberisactivarlaconexin
wifi en vuestro dispositivo Android y conectaros a vuestra red local para que podis tener acceso al servicio. En
caso de no tener wifi teneis otras opciones como montar el servicio web en un servidor en internet, los datos se
descargarnechandomanodevuestraconexin3G,otambinlopodeisprobarconelemuladordeAndroid.

PorltimoestelmtodoparseJSONLibros,estesimplementerecorreelarrayqueobtuvimosantes,encadauna
de las vueltas se a tener acceso a un objeto json libro, el cual tiene las propiedades: id, libro e isbn. Podemos
accederalobjetomediantelibrosArray.getJSONObject(i),dondeieslaposicinquequeremosrecuperar,ypara
accederalaspropiedadessimplementecon getInt("nombre") o getString("nombre")dependiendodeltipode

datoquetengamosquerecuperar.
data:text/htmlcharset=utf8,%3Cheader%20class%3D%22entryheader%22%20style%3D%22display%3A%20block%3B%20color%3A%20rgb(55%2C%2055

3/4

23/11/2014

LeyendoservicioswebdesdeAndroid:JSON|Nosinmiubuntu|Ubuntuenconcreto,GNU/Linuxengeneral

Por ltimo, en mi caso me he creado un objeto Libro, al cual seteo las propiedades correspondientes y llamo al
mtodo save para guardar en la base de datos de la aplicacin. No os pongo como sera esta parte porque ya
hemos tratado cmo guardar datos en base de datos SQLite tambin podis ver el resultado de lo que habis
descargadoleyendolosdatosdelabasededatos.

ParautilizarestaclasesimplementedebereiscrearunainstanciadelobjetoJSONParserLibrosyllamaralmtodo
readAndParseJSONLibrosenlapartedevuestraaplicacinquemsosinterese.UtilizadaenelmtodoOnCreate
deunaActivityquedaradelasiguienteforma:

JSONParserLibrosjson=newJSONParserLibros(this)
json.readAndParseJSONLibros()

Uno de los aspectos que debeis tener en cuenta tambin es la frecuencia con la que se actualizan vuestros
contenidos, si los libros se actualizan de media cada 2 das lo que podeis hacer es guardar en las
SharedPreferenceslaltimafechadeactualizacinyenelmtodopblicoreadAndParseJsonLibrosverificarque
hayanpasado2dasomsparallamaravuestroservicio.Cadavezquehagaislecturareescribisestafechacon
lafechaactual.
Bueno, hasta aqu la ltima parte de esta serie de captulos dedicados a los servicios web. Espero os sean de
ayuda. Por ltimo, os voy adelantando el tema de la semana que viene, como registrar visitas con Google
AnalyticsennuestraaplicacinAndroid.

data:text/htmlcharset=utf8,%3Cheader%20class%3D%22entryheader%22%20style%3D%22display%3A%20block%3B%20color%3A%20rgb(55%2C%2055

4/4

Вам также может понравиться