7.1 Hide UI Elements Στο Android Studio όταν θέλουμε να κρύψουμε οτιδήποτε (κάποιο Button, ένα TextView, ένα ImageView κλπ) μπορούμε να χρησιμοποιήσουμε την παρακάτω εντολή: setvisibility(view.invisible) και αντίστοιχα για να το εμφανίσουμε setvisibility(view.visible) Για παράδειγμα για να κρύψουμε ένα TextView με όνομα tv γράφουμε TextView tv = (TextView) findviewbyid(r.id.textview); tv.setvisibility(view.invisible); άσκηση 1 Βάλτε δύο κουμπιά Show και Hide και ένα TextView. Όταν πατάτε το Hide να κρύβεται το TextView κι όταν πατάτε το Show να εμφανίζεται. 7.2 Try and Catch Πολλές φορές θέλουμε να εκτελέσουμε κάποιες εντολές χωρίς όμως να είμαστε 100% σίγουροι ότι θα λειτουργήσουν σωστά ή χωρίς να προκαλέσουν σφάλμα στο πρόγραμμά μας. Για παράδειγμα, αν έχουμε μια εφαρμογή που προσπαθεί να κατεβάσει κάποια δεδομένα από μια ιστοσελίδα και την ώρα που επιχειρήσει να τα κατεβάσει, δεν υπάρχει σύνδεση στο διαδίκτυο ή ακόμη και η ιστοσελίδα έχει «πέσει». Για να αποφύγουμε το να κρασάρει η εφαρμογή μας, μπορούμε να χρησιμοποιήσουμε τις εντολές try και catch. Δείτε τον παρακάτω κώδικα και προσπαθήστε να κατανοήσετε τι κάνει. Μπορείτε να το τρέξετε χωρίς τα try and catch για να δείτε τι θα συνέβαινε αν έτρεχε χωρίς αυτά; Μανώλης Τσικνάκης, Αλέξανδρος Ρονιώτης, Ευαγγελία Μανιαδή Ηράκλειο 2016
int[] numbers = new int[3]; try{ for(int i=0; i<=3; i++) { numbers[i]=i; catch(arrayindexoutofboundsexception e){ System.out.println("Index out of bounds!"); //catch specific Exception catch(exception e){ System.out.println(e); //Leave as backup if another exception happens Σελίδα 2
7.3 Downloading Web Content Αν ασχοληθείτε με εφαρμογές για κινητά, πολλές φορές θα χρειάζεται να κατεβάζετε υλικό από το δίκτυο (π.χ. από κάποια ιστοσελίδα) για να το χρησιμοποιήσετε στην εφαρμογή σας. Γι αυτό θα πρέπει να γνωρίζετε μερικά πράγματα για τα threads του Downloading. Εδώ θα δούμε πώς μπορούμε να διαβάσουμε τον κώδικα (HTML) που βρίσκεται σε μια σελίδα, π.χ. το http://www.pagni.gr. Αυτό είναι πολύ συνηθισμένο όταν εργάζεστε με APIs διαφόρων υπηρεσιών. Δημιουργία class με extends AsyncTask Το πρώτο πράγμα που θα κάνουμε είναι να δημιουργήσουμε μια νέα κλάση DownloadTask, η οποία είναι μια ειδική κλάση καθώς κάνει extend την ήδη υπάρχουσα AsyncTask. Αυτό που προσπαθούμε να κάνουμε είναι να δημιουργήσουμε ένα νέο Thread που θα κάνει download το content από την ιστοσελίδα, παράλληλα με το MainThread (ή UIThread) που τρέχει η OnCreate. Αυτό είναι πολύ σημαντικό να το γνωρίζουμε, γιατί έτσι η εφαρμογή μας δεν χρειάζεται να περιμένει να κατεβεί όλο το περιεχόμενο για να εκτελεστεί. return null; Η AsyncTask παίρνει τρία ορίσματα. Το πρώτο (συνήθως String) είναι ο τύπος των δεδομένων που θέλουμε να περάσουμε σε αυτή την κλάση. Στην περίπτωσή μας αυτό θα είναι το URL της ιστοσελίδας μας http://www.pagni.gr. Το δεύτερο όρισμα είναι το όνομα της μεθόδου που θα χρησιμοποιήσουμε για να δείξουμε την πρόοδο του Task μας. Αν απαιτείται μεγάλος χρόνος για το Task μας καλό είναι να χρησιμοποιείται. Εδώ δεν θα το χρησιμοποιήσουμε και βάζουμε Void. Το τρίτο όρισμα (εδώ String) είναι ο τύπος των δεδομένων που θα μας γυρίσει το task που τρέχουμε. Στην περίπτωση μας θα είναι όλος ο HTML κώδικας της σελίδας μας. Μέσα στην κλάση κάνουμε override τη μέθοδο doinbackground που είναι protected (δηλαδή χρησιμοποιείται από οπουδήποτε μέσα στο package της εφαρμογής). Το String params είναι τύπου VarArg, δηλαδή ουσιαστικά ένας πίνακας με μεταβλητό μέγεθος. Π.χ. το params[0] είναι τα δεδομένα στην πρώτη θέση του πίνακα. Αντίστοιχα για να το ορίσουμε μπορούμε να βάλουμε params= Alex, Mike, δηλαδή χωρίς τα [] των πινάκων. Σελίδα 3
Για να τα «ενώσω» γράφω στην oncreate τις παρακάτω εντολές task.execute("http://www.pagni.gr/"); Ουσιαστικά αυτή η εντολή περνάει στο όρισμα params[0] το URL μας. Όμως είπαμε ότι το task μας επιστρέφει String, άρα αλλάζουμε το πρόγραμμά μας ως εξής: Log.i("URL", params[0]); return "Done"; Όμως βλέπω ότι μου βγάζει σφάλμα στην τελευταία εντολή και κάνω την αλλαγή που προτείνει (surroung with try and Catch). Το σφάλμα που μπορεί να προκύψει είναι ότι μπορεί να μην μπορεί να κάνει download την σελίδα (π.χ. δεν υπάρχει σύνδεση στο δίκτυο): try { Log.i("Result", result); catch (InterruptedException e) { catch (ExecutionException e) { Αν το τρέξετε θα τυπώσει το URL και το Done στα Logs. Προς το παρόν έχουμε κάνει τη δημιουργία του thread μας που τρέχει παράλληλα με το MainTask (στο background). Σύνδεση με την ιστοσελίδα και διάβασμα περιεχομένου Το πρώτο πράγμα που θα κάνουμε είναι να πάρουμε τα permission για την σύνδεση στο διαδίκτυο. Αυτό θα γίνει στο manifest.xml με την παρακάτω γραμμή. <uses-permission android:name="android.permission.internet" /> Σελίδα 4
Στην συνέχεια, στη java, γράφουμε τον παρακάτω κώδικα για να διαβάσουμε τα δεδομένα και να τα τυπώσουμε στα logs. public class MainActivity extends AppCompatActivity { String result = ""; URL url; //The URL is actually a string of the right format HttpURLConnection urlconnection = null; //this is actually a connection, like a browser try{ //there might be an error during connect url = new URL(params[0]); //this could give exception if malformated url (without http, etc) urlconnection = (HttpURLConnection) url.openconnection(); //think it as opening the browser InputStream in = urlconnection.getinputstream(); //Open a stream to hold the input of data InputStreamReader reader = new InputStreamReader(in); //we then start reading data int data = reader.read(); //read one char while(data!= -1) //-1 when it finishes reading { char current = (char) data; result += current; data = reader.read(); return result; catch (Exception e){ return "Failed"; try { Log.i("Content", result); catch (InterruptedException e) { catch (ExecutionException e) { Σελίδα 5