0% au considerat acest document util (0 voturi)
16 vizualizări39 pagini

CursDAM 7

Drepturi de autor
© © All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
16 vizualizări39 pagini

CursDAM 7

Drepturi de autor
© © All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd
Sunteți pe pagina 1/ 39

Dispozitive și Aplicații

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");

PrelAsinc pa = new PrelAsinc ();

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.

//KSOAP call configuration


private static final String NAMESPACE ="http://tempuri.org/";
private static final String METHOD_NAME ="GetNearCinemaList";
private static final String SERVICE_URL ="address to SOAP service";
final String SOAP_ACTION ="http://tempuri.org/GetNearCinemaList";
private static final String ID_MOVIE = "1";

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

 JavaScript Object Notation


 { } – obiect
 [ ] – vector de valori
 "proprietate" : "valoare"

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

 Clasa Document (impl. Node)

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");

for (int i = 0; i < jaCarti.length(); i++) {


Carte carte = new Carte();
// preluare carte
JSONObject joCarte = jaCarti.getJSONObject(i);
String titlu = joCarte .getString("titlu");
carte.setTitlu(titlu);
int an = joCarte .getInt("an");
String cota = joCarte.getString("-cota");
….
} 38
Bibliografie
 P. Pocatilu, Programarea dispozitivelor mobile, Editura ASE,
2012.
 C. Boja, C. Ciurea, M. Doinea – Android Mobile Applications:
A Practical Development Guide, Editura ASE, 2015, ISBN 978-
606-34-0033-9, 418 pg.
 P. Pocatilu, I. Ivan ș.a., Programarea aplicațiilor Android,
Editura, ASE, 2015.
 S. Komatineni, D. MacLean, Pro Android 4, Apress, 2012
 R. Meier, Professional Android 4 Application Development,
Wiley, 2012
 http://developer.android.com

39

S-ar putea să vă placă și