CursDAM 7
CursDAM 7
Mobile – curs 7
Prof. univ. dr. Paul POCATILU, Prof. univ. dr. Cristian CIUREA
Departamentul de Informatică și Cibernetică Economică
[email protected]
1
Agenda
Accesul la rețea
Prelucrarea fișierelor XML și JSON
2
Accesul la rețea
Mecanismele Android pentru accesarea datelor de rețea se
bazează pe protocoale standardizate pentru accesarea
resurselor online.
Un obiect HttpClient este utilizat pentru acces la distanță prin
intermediul metodelor POST și GET după deschiderea unei
conexiuni cu clasa HttpURLConnection.
Principalul avantaj al acestui mecanism este că poate fi utilizat
pentru orice tip de resurse.
Pentru a efectua operații de rețea utilizând apel asincron, se
poate utiliza clasa AsyncTask și toate procesele sunt
implementate în metoda doInBackground().
3
Accesul la rețea
Metodele de acces la distanță acceptă conexiuni securizate cu
SSL sau TLS prin HTTP și alte proprietăți de conexiune, cum ar
fi streaming, expirări (timeouts) și pooling de conexiuni.
HttpURLConnection presupune utilizarea obiectelor ca fluxuri
de date. Un obiect URL este definit cu adresa către o locație la
distanță ca prim parametru. Pe baza obiectului URL se
definește o conexiune HTTP cu caracteristici precum:
Expirarea timpului de citire;
Expirarea timpului de conectare;
Metoda de solicitare (GET/POST).
4
Accesul la rețea
Pentru ca aplicația Android să poată accesa informații despre rețea
și pentru a utiliza resursele la distanță, trebuie adăugate
permisiunile INTERNET și ACCESS_NETWORK_STATE în
AndroidManifest.xml.
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE"/>
5
Accesul la rețea
Pentru accesarea datelor de rețea, mai întâi ar trebui să existe
o rețea și dispozitivul să fie conectat la aceasta. După aceea,
operațiunile de rețea trebuie făcute pe un fir separat pentru a
nu interfera cu firul principal de interfață UI și a bloca interfața
din cauza întârzierilor imprevizibile.
Pentru a efectua operațiuni de rețea utilizând un apel asincron,
se poate folosi clasa AsyncTask și implementarea întregului
proces în metoda doInBackground().
6
Accesul la rețea
Pentru a verifica conectivitatea la rețea, un obiect
ConnectivityManager trebuie definit si inițializat cu
Context.CONNECTIVITY_SERVICE prin utilizarea metodei
getSystemService(). Din acest obiect prezența și starea rețelei
pot fi verificate accesând metodele getActiveNetworkInfo() și
isConnected().
7
Accesul la rețea
Pentru a accesa resursele la distanță, clasa care extinde
AsyncTask trebuie să suprascrie trei metode :
onPreExecute() – această metodă este utilizată pentru a
inițializa toate variabilele înainte de a executa cererea;
doInBackground() – aici are loc solicitarea efectivă de date;
onPostExecute() – această metodă implementează logica
aplicației după ce solicitarea web a fost finalizată.
8
Accesul la rețea
9
Clasa AsyncTask
Clasa abstractă AsyncTask<param, prog, rez>
Metode cu apel invers:
doInBackground(param… pars)
onProgressUpdate(prog…pars)
publishProgress()
onPostExecute(rez par)
onPreExecute()
Lansarea în execuție
metoda execute(param)
10
Clasa AsyncTask
onPreExecute()
Rulată înainte de începerea prelucrărilor
doInBackground()
Execută operația de lungă durată
Rulată în mod asincron
onProgressUpdate()
Se apelează periodic pentru afișarea progresului operației de lungă durată
Invocată după apelurile metodelor de tip publishProgress()
onPostExecute()
Se apelează după încheierea prelucrărilor
Primește ca parametru obiectul rezultat în urma prelucrărilor
11
Apelurile Clasa AsyncTask
12
Exemplu AsyncTask
//Parametrul transmis este un URL
//Rezultatul este un şir de caractere (String)
//progresul nu este monitorizat (Void)
class PrelAsinc extends AsyncTask<URL, Void, String> {
@Override
protected String doInBackground(URL... url) {
//acces url: url[0]
//conectare la server si preluare continut
return un_string;
}
@Override
protected void onPostExecute(String un_string) {
//actualizare element interfata grafica;
textView.setText(un_string);
}
13
}
Exemplu AsyncTask
//Apelul din firul principal
URL url = new URL("http://pdm.ase.ro");
pa.execute(url);
14
Servicii Web
SOAP
Mesaje XML
WSDL
REST, RESTful (Representational State Transfer)
XML, JSON, HTML
15
Servicii Web SOAP
Biblioteca kSOAP2
Se creează un mesaj SOAP
clasa SoapSerializationEnvelope
detaliile cererii se adaugă la mesaj prin intermediul clasei
SoapObject;
Clasa HttpTransportSE este utilizată pentru a efectua apelul real al
metodei serviciului Web, mesajul fiind transmis ca parametru.
metoda call()
Rezultatul este preluat de la partea de răspuns a mesajului
getResponse()
16
Servicii Web SOAP
SOAP sau Simple Object Access Protocol este o specificație de
protocol pentru schimbul de informații structurate. SOAP este
utilizat în implementarea serviciilor web, bazate pe XML,
Extensible Markup Language, pentru a descrie formatul
mesajelor schimbate printr-o conexiune HTTP.
Comparativ cu accesul resurselor la distanță prin intermediul
unui DefaultHttpClient, consumul unui serviciu web .NET nu
poate fi realizat folosind instrumente Android standard.
Bibliotecile externe sunt necesare pentru a formata, serializa,
trimite și primi conținut prin HTTP folosind SOAP. Un astfel de
exemplu de bibliotecă externă este kSOAP, un proiect open
source.
17
Servicii Web SOAP
Pentru utilizarea bibliotecii kSOAP trebuie definită o listă de
atribute care descriu serviciul web .NET care trebuie consumat:
NAMESPACE - o valoare care reprezintă domeniul în care rulează
serviciul web, poate fi specifică organizației;
METHOD_NAME - numele metodei care trebuie consumată;
SERVICE_URL - adresa URL a descrierii serviciului; locația de
unde poate fi accesat serviciul;
SOAP_ACTION - este echivalent cu spațiul de nume concatenat
cu numele metodei;
PARAMETRI - parametrii locali ai metodei.
18
Servicii Web SOAP
Atributele sunt definite ca obiecte de tip String.
Accesul la serviciul web se face pe un fir separat decât firul
principal UI și pentru aceasta trebuie implementat un
mecanism de tip Thread.
19
Fișiere XML
Noduri/elemente
Un nod rădăcină
Atribute
<?xml version="1.0" encoding="ISO-8859-1"?>
<element_radacina>
<element atribut="val_atribut">
val_element sau alte elemente
</element>
…
</element_radacina>
20
Fișiere XML
<?xml version="1.0" encoding="ISO-8859-1"?>
<biblioteca>
<carte cota="19222">
<autor>
<nume>R. Meier</nume>
</autor>
<titlu> Professional Android Application Development </titlu>
<editura>wiley</editura>
<an>2009</an>
<isbn>1-72-11-2222</isbn>
<pagini>500</pagini>
</carte>
21
Fișiere XML
<carte cota="19223">
<autor>
<nume>S. Hashimi</nume>
<nume> S. Komatineni</nume>
<nume> D. MacLean </nume>
</autor>
<titlu>Pro Android 3</titlu>
<editura>Apress</editura>
<an>2011</an>
<isbn>0-321-15040-6</isbn>
<pagini>336</pagini>
</carte>
</biblioteca>
22
Fișiere JSON
23
Fișiere JSON
{
"biblioteca": {
"carte": [
{
"-cota": "19222", "autor": { "nume": "R. Meier" }, "titlu": " Professional Android Application
Development ", "editura": "wiley", "an": "2009", "isbn": "1-72-11-2222", "pagini": "500" },
{
"-cota": "19223", "autor": { "nume": [ "S. Hashimi", " S. Komatineni", " D. MacLean " ] },
"titlu": "Pro Android 3", "editura": "Apress", "an": "2011",
"isbn": "0-321-15040-6", "pagini": "336"
}
]
}
}
24
Prelucrare fișiere XML
SAX (Simple API for XML)
org.xml.sax
SAXParserFactory, SAXParser
Parcurgere secvențială a documentului XML
Evenimente – funcții cu apel invers
XML Pull
org.xmlpull.v1
XmlPullParserFactory, XmlPullParser
Parcurgere secvențială a documentului XML
Evenimente – tratate imediat
DOM
org.w3c.dom
DocumentBuilderFactory, DocumentBuilder, Document
Se generează o structură ierarhică în memorie
Nodurile sunt grupate în liste
25
Prelucrare fișiere XML
SAX
SAXParserFactory
utilizată pentru crearea obiectelor de tip SAXParser
SAXParser
responsabilă cu prelucrarea fișierului XML
XMLReader
citirea fișierului XML
metoda parse()
Clasă derivată din DefaultHandler
26
Prelucrare fișiere XML
Clasa derivată din DefaultHandler
Metode apelate în timpul prelucrării
startElement()
apelată la începerea citirii unui nou element;
endElement()
apelată la sfârșitul citirii unui element;
characters()
apelată la apariția unei secvențe de caractere din cadrul unui element
Se asociază la XmlReader
setContentHandler()
Preluare rezultat
27
Prelucrare fișiere XML
SAXParserFactory fact = SAXParserFactory.newInstance();
SAXParser xmlParser = fact.newSAXParser();
XMLReader xmlReader = xmlParser.getXMLReader();
SAXHandler handler = new SAXHandler();
xmlReader.setContentHandler(handler);
xmlReader.parse(new InputSource(streamIn));
28
Prelucrare fișiere XML
XML Pull
Interfața XmlPullParser
Inițializare
Resources#getXml()
res/xml
Xml.newPullParser()
XmlPullParserFactory#newPullParser()
XmlPullParserFactory
XmlPullParserFactory.newInstance()
Asociere flux de intrare (InputStream sau Reader)
setInput()
29
Prelucrare fișiere XML
XmlPullParser
next() – parcurgerea documentului
Evenimente
Tipuri: START_TAG/END_TAG, TEXT,
START_DOCUMENT/END_DOCUMENT
getEventType()
nextToken() – parcurgerea cu evenimente adiționale
getName() – obținere nume etichetă
getText() – obținere conținut
getAttributeCount() – număr atribute
getAttributeValue() – valoare atribut
30
Prelucrare fișiere XML
static ArrayList<Carte> prelucreazaXML_Pull(InputStream isXML) {
ArrayList<Carte> lista = new ArrayList<Carte>();
Carte carte = null;
int event; String text = null;
try {
// creare parser
XmlPullParser xmlParser = Xml.newPullParser();
xmlParser.setInput(isXML, null);
event = xmlParser.getEventType();
while (event != XmlPullParser.END_DOCUMENT) {
String name = xmlParser.getName();
//aici este switch-ul de alături -->
event = xmlParser.next();
}
} catch (Exception e) {e.printStackTrace(); } 31
return lista;}
Prelucrare fișiere XML
switch (event) {
case XmlPullParser.START_TAG:
if (name.equals("carte")) {
carte = new Carte();
carte.setCota(xmlParser.getAttributeValue(null,"cota"));
}
break;
case XmlPullParser.TEXT:
text = xmlParser.getText();
break;
case XmlPullParser.END_TAG:
if (name.equals("titlu")) { carte.setTitlu(text); }
if (name.equals("carte")) { lista.add(carte); }
break;
} 32
Prelucrare fișiere XML
DOM
Interfețe
Node
Element (impl. Node)
NodeList
item(poz)
Clasa DocumentBuilder
metoda parse()
InputStream
33
Prelucrare fișiere XML
DOM
Document
getElementsByTagName()
NodeList
Element
getAttribute()
Node
getTextContent()
34
Prelucrare fișiere XML
DocumentBuilderFactory docBuilderFactory =
DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
//obținerea flux de intrare
InputStream is = getResources().openRawResource(R.raw.biblx);
//creare document
Document docXml = docBuilder.parse(is);
35
Prelucrare fișiere XML
if (docXml != null) {
//obținere listă de noduri de tipul dat
NodeList carti = docXml.getElementsByTagName("carte");
//parcurgere listă
for (int i = 0; i < carti.getLength(); i++) {
//preluare și prelucrare noduri
Node nodCrt = carti.item(i);
if (nodCrt.getNodeType() == Node.ELEMENT_NODE) {
Element obj= (Element) nodCrt;
Carte carte = new Carte();
carte.cota = obj.getAttribute("cota");
carte.titlu = obj.getElementsByTagName("titlu").
item(0).getTextContent();
carte.isbn = obj.getElementsByTagName("isbn").
item(0).getTextContent();
}
}
} 36
Prelucrare fișiere JSON
org.json
JSONObject
getTIP(): getString(), getBoolean(), getInt() etc.
getJSONArray()
getJSONObject()
JSONArray
length()
getTIP(index)
37
Prelucrare fișiere JSON
JSONObject jObject = new JSONObject(stringJson);
JSONObject joBibl = jObject.getJSONObject("biblioteca");
JSONArray jaCarti = joBibl.getJSONArray("carte");
39