Διάλ ε ξη 10 Android και Threads AsyncTasks Handlers SQLite Android και Web Services Android Design Patterns Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Διάλεξη 10 1
Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Android και Threads AsyncTasks Handlers SQLite Android και Web Services Android Design Patterns 2
Android και Threads Εκκίνηση εφαρμογής εκκίνηση νήματος γνωστό ως main ή UI thread Κανόνες που διέπουν το Android single thread model 1.To U Ι thread δεν πρέπει να μπλοκάρεται 2.Αποφυγή πρόσβασης στο Android UI toolkit από άλλα thread εκτός του UI thread UI thread Υπεύθυνο για την αποστολή γεγονότων συμπεριλαμβανομένων και των drawing events Παράδειγμα: Click ένα κουμπί το UI thread αποστέλλει το γεγονός αυτό στο αντίστοιχο widget το οποίο θέτει τη press state του συγκεκριμένου κουμπιού σε true και προσθέτει στην ουρά γεγονότων μία αίτηση Τo UI thread αφαιρεί αυτή την αίτηση και ενημερώνει το widget να κάνει redraw το widget έκτελεί το redraw και η αλλαγή φαίνεται στο χρήστη. Αποφυγή εκτέλεσης χρονοβόρων διαδικασιών σε αυτό το thread Θα μπλοκάρει όλη η διεπαφή, Ο χρήστης νομίζει ότι η εφαρμογή κολλάει ή έχει κρεμάσει Αν το νήμα μπλοκάρει για μεγάλο χρονικό διάστημα, ο χρήστης ενημερώνεται από το λειτουργικό σύστημα ότι η εφαρμογή δεν ανταποκρίνεται. Πχ: Μη ανταπόκριση σε ένα input event (π.χ. πάτημα ενός κουμπιού) εντός 5 δευτερολέπτων Μη ολοκλήρωση των λειτουργιών ενός BroadcastReceiver εντός 10 δευτερολέπτων Διάλεξη 10 3
Android και Threads Μέθοδοι αποφυγής των προβλημάτων αυτών Χρήση πολλαπλών Threads Παραβίαση του single thread model το οποίο ορίζει ότι το Android UI toolkit το χειρίζεται μόνο το UI thread Μπορούν να χρησιμοποιηθούν για άλλες ενέργειες που δεν αλληλεπιδρούν με το UI (worker threads) Τρόποι πρόσβασης στο UI από άλλα threads Περίπλοκες διαδικασίες που κάνουν περίπλοκο τον κώδικα Παραδείγματα Activity.runOnUiThread(Runnable r) View.post(Runnable) View.postDelayed(Runnable) Handler Χρήση των AsyncTasks Αναλαμβάνει να διαχειριστεί τα threads για τον χρήστη Διάλεξη 10 4
Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Android και Threads AsyncTasks Handlers SQLite Android και Web Services Android Design Patterns 5 Διάλεξη 10
AsyncTask Δημιουργία κλάσης που κάνει extend την AsyncTask κλάση Το instance του αντικειμένου πρέπει να δημιουργηθεί στο Ui thread Το ΑsyncTask εκτελείται μία φορά ΜΟΝΟ Χρήσιμες μέθοδοι για override doInBackground() εκτελείται αυτόματα σε νέο thread onPreExecute(), onPostExecute() and onProgressUpdate() γίνονται invoke από το Ui thread, επιτρέποντας έτστι τη πρόσβαση στο Android UI Toolkit Αυτό που επιστρέφει η doInBackground() αποστέλλεται στην onPostExecute() Καλώντας την publishProgress() οποιαδήποτε στιγμή στην doInBackground() εκτελείται η onProgressUpdate() στο UI thread Το κάθε task μπορεί να ακυρωθεί οποιαδήποτε στιγμή από οποιοδήποτε Thread Παράδειγμα: Διάλεξη 10 6
Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Android και Threads AsyncTasks Handlers SQLite Android και Web Services Android Design Patterns 7 Διάλεξη 10
Handler class Επιτρέπουν την αποστολή και διαχείριση Μessage και Runnable αντικειμένων που σχετίζονται με την ουρά μηνυμάτων ενός νήματος Κάθε Handler instance συσχετίζεται με ένα νήμα (και την αντίστοιχη ουρά μηνυμάτων). Η συσχέτιση αυτή γίνεται κατά τη δημιουργία του Handler instance, οπότε αυτό είναι πλέον «συνδεδεμένο» με το νήμα που το δημιούργησε Σε αυτό το νήμα θα αποστέλλει Message και Runnable αντικείμενα. Τα μηνύματα τοποθετούνται στην ουρά μηνυμάτων και εκτελούνται όταν βγουν από αυτή. Διάλεξη 10 8
Handler class Τα Handlers είναι χρήσιμα όταν πρέπει: Να χρονοπρογραμματίσουμε την εκτέλεση Messages ή Runnables κάποια στιγμή στο μέλλον Να προσθέσουμε μία ενέργεια που θα εκτελεστεί σε άλλο thread Βασικές μέθοδοι για scheduling Messages ή Runnables post(Runnable), postAtTime(Runnable, long), postDelayed(Runnable, long), sendEmptyMessage(int), sendMessage(Message), sendMessageAtTime(Message, long), sendMessageDelayed(Message, long) handleMessage(Message) Ένας Handler μπορεί να αναλάβει την επικοινωνία ανάμεσα στο mainThread που είναι υπεύθυνο για τη διαχείριση των top-level αντικειμένων (activities, broadcast receivers κλπ.) με τα υπόλοιπα threads Διάλεξη 10 9 Τοποθετούν Runnable objects ώστε να κληθούν από την ουρά μηνυμάτων όταν ληφθούν Τοποθετούν Message objects που περιέχουν δεδομένα προς επεξεργασία Υλοποιείται από τις υποκλάσεις του Handler και καλείται για να επεξεργαστεί τα δεδομένα που στέλνουν οι sendMessage
Service vs Thread vs IntentService vs AsyncTask ServiceThreadIntentServiceAsyncTask When to use ? Task with no UI, but shouldn't be too long. Use threads within service for long tasks. - Long task in general. - For tasks in parallel use Multiple threads (traditional mechanisms) -Long task usually with no communication to main thread. - If communication is required, can use main thread handler or broadcast intents - When callbacks are needed (Intent triggered tasks). - Small task having to communicate with main thread. - For tasks in parallel use multiple instances OR Executor TriggerCall to method onStartService()Thread start() methodIntentCall to method execute() Triggered From (thread)Any threadAny Thread Main Thread (Intent is received on main thread and then worker thread is spawed) Main Thread Runs On (thread)Main ThreadIts own threadSeparate worker thread Worker thread. However, Main thread methods may be invoked in between to publish progress. Limitations / Drawbacks May block main thread- Manual thread management - Code may become difficult to read - Cannot run tasks in parallel. - Multiple intents are queued on the same worker thread. - one instance can only be executed once (hence cannot run in a loop) - Must be created and executed from the Main thread Διάλεξη 7 10
Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Android και Threads AsyncTasks Handlers SQLite Android και Web Services Android Design Patterns 11 Διάλεξη 10
SQLite Database Open Source Database ενσωματωμένη στην πλατφόρμα Android Υποστηρίζει λειτουργικότητα σχεσιακών βάσεων δεδομένων Συντακτικό SQL Transactions Prepared Statements Απαιτεί ελάχιστη μνήμη (~250 Kbytes) Υποστηρίζει του τύπους TEXT (ανάλογο του String της Java) INTEGER (ανάλογο του long της Java) REAL (ανάλογο του double στη Java) Όλοι οι άλλοι τύποι πρέπει να μετατραπούν σε κάποιον από τους παραπάνω για να αποθηκευθούν στην ΒΔ Κάθε εφαρμογή μπορεί να χρησιμοποιεί τη δική της Βάση Δεδομένων Path: /DATA/data/APP_NAME/databases/FILENAME Με χρήση της Java μπορούμε να δημιουργήσουμε, να ανοίξουμε μια βάση, να δημιουργήσουμε πίνακες στη βάση, να εισάγουμε και να εξάγουμε δεδομένα προς και από τους πίνακες. 12 Διάλεξη 10
SQLite - Κλάση SQLiteDatabase Η κλάση SQLiteDatabase αποτελεί τη βασική κλάση για την αλληλεπίδραση με τη βάση SQLite. Παρέχει μεθόδους για άνοιγμα και κλείσιμο της βάσης Παρέχει μεθόδους για εισαγωγή, διαγραφή και ενημέρωση δεδομένων στη βάση Μέθοδοι insert(), update() και delete() Παρέχει τη μέθοδο execSQL() για την εκτέλεση SQL statements Το αντικείμενο ContentValues επιτρέπει τον καθορισμό ζευγαριών (κλειδί, τιμή) και επιτρέπει την εισαγωγή και ανανέωση δεδομένων στη βάση. Το κλειδί (key) αντιπροσωπεύει το όνομα της στήλης του πίνακα, ενώ η τιμή (value) το περιεχόμενο του πίνακα στη συγκεκριμένη στήλη για την τρέχουσα εγγραφή Επερωτήσεις μπορούν να δημιουργηθούν με χρήση των μεθόδων rawQuery() και query() ή με χρήση της κλάσης SQLiteQueryBuilder. 13 Διάλεξη 10
Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Android και Threads AsyncTasks Handlers SQLite Android και Web Services Android Design Patterns 14 Διάλεξη 10
Android and Web Services Μοντέλο Επικοινωνίας Αίτηση για WS με τις αντίστοιχες παραμέτρους της μεθόδου, Λήψη απάντησης από τον εξυπηρετητή, Ανάκτηση δεδομένων από την απάντηση. Συνήθεις τύποι Web Services SOAP Το Android δεν περιλαμβάνει SOAP Client. Δύο λύσεις: Χρήση Third Party Libraries KSOAP2 project Ελαφριά και αποδοτική βιβλιοθήκη για SOAP client σε Android συσκευές Στηρίζεται σε Java 1.3 Δουλεύει και σε άλλες πλατφόρμες που στηρίζονται σε Java Κλήση SOAP Web Service με native Αndroid APIs. Δημιουργία της SOAP αίτησης εξολοκλήρου από τον χρήστη και διαχείριση της απάντησης. Απαραίτητη η χρήση HttpClient κλάσης XML parser REST Πιο απλή διαδικασία Αίτηση υπηρεσίας καλώντας το URL με τις παραμέτρους Ασφαλής σύνδεση με Web Service πάνω από ένα Secure Sockets Layer πρωτόκολλο Η HttpClient δεν υποστηρίζει SSL συνδέσεις Σύνδεση μέσω την javax.net.ssl.HttpsURLConnection για ασφαλή σύνδεση Στα πλαίσια της εργασίας θα χρησιμοποιηθεί η KSOAP2 βιβλιοθήκη για επικοινωνία με Web Services από Android συσκευές 15 Διάλεξη 10
Παράδειγμα χρήση ksoap2 Βήματα υλοποίησης Δημιουργία Web Service Έλεγχος δημιουργίας wsdl αρχείου Δημιουργία Android Web Service Client Τροποποίηση των permissions στο AndroidManifest.xml 16 AndroidManifest.xml Διάλεξη 10
Παράδειγμα χρήσης ksoap2 17 Web Service Web Service Client WSDL file Διάλεξη 10
Παράδειγμα χρήσης ksoap2 Από την έκδοση Android 3.0 και πάνω δεν επιτρέπεται η σύνδεση στο διαδίκτυο από το κυρίως νήμα εκκίνηση νέου νήματος 18 Δημιουργία αίτησης SOAP με βάση το namespace και το method_name Δημιουργία και αποστολή SOAP envelope Λήψη SOAP απάντησης Προβολή απάντησης στην οθόνη Διάλεξη 10
Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Android και Threads AsyncTasks Handlers SQLite Android και Web Services Android Design Patterns 19 Διάλεξη 10
ViewHolder Το View Holder επιτρέπει τη πρόσβαση σε κάθε list item ενός List Activity χωρίς την χρήση της findViewById() στην getView() του ArrayAdapter η οποία καλείται κατά το scrolling Πως δουλεύει: Διάλεξη 7 20 To layout γίνεται inflate τη 1 η φορά μόνο Σε ΚΑΘΕ κλήση (πχ όταν γίνεται scrolldown) για ΌΛΑ τα list items ψάχνει να βρει το id, καταναλώνοντας πόρους από τη μνήμη
Half Synchronous- Half Asynchronous Καθορίζει τη δομή των νημάτων σε μία πολυνηματική εφαρμογή Η διαχείριση των νημάτων διασπάται σε 2 διαχειριστικά κομμάτια Το ασύγχρονο κομμάτι είναι η επικοινωνία του main thread με ένα άλλο thread (worker thread) To σύγχρονο κομμάτι είναι η ανάθεση tasks σε άλλα νήματα (τα οποία λαμβάνονται από κάποιο pool) από το worker thread Ουσιαστικά τα AsyncTasks υλοποιούν αυτό το design pattern Διάλεξη 7 21 API versioning Αρχικά τα AsyncTasks εκτελούνταν σειριακά σε ένα μόνο background thread. DONUT SDK: Αντί για ένα background thread υπάρχει pool από νήματα επιτρέποντας σε πολλαπλά tasks να εκτελούνται παράλληλα HONEYCOMB SDK: άλλαξε πάλι σε ένα thread για αποφυγή λαθών σε εφαρμογές λόγω παράλληλης εκτέλεσης tasks. Η λύση για παράλληλη εκτέλεση των tasks είναι η χρήση του executeOnExecutor(Executor, Params...) με το flag THREAD_POOL_EXECUTOR Συνίσταται να αποφεύγεται και αν κάτι τέτοιο δεν είναι εφικτό, θα πρέπει να γίνεται με μεγάλη προσοχή.
Αναφορές Threads threads.html threads.html AsyncTasks Handlers Other Service vs Thread vs IntentService vs AsyncTask android.html android.html Common Tasks in Android Keeping the App responsive Διάλεξη 10