Tillbaka till lektionslistan
Mobila applikationer med Android: Inlämningsuppgift 4
Meningen med den här uppgiften är:
-
Man ska lära sig nätverkskommunikation med hjälp av sockets
(klassen Socket)
i Android.
-
Man ska lära sig använda trådar
(klassen Thread och kanske också gränssnittet Runnable
och klassen AsyncTask) i Android.
Uppgift
Skapa en Android-app som fungerar som klient
i chat-systemet (med flera trådar) som finns i
lektion 9.
Här är ett utkast till hur den skulle kunna se ut:
Ha gärna möjlighet att logga in och logga ut också.
Förslag på arbetsgång
-
Börja med att ladda hem och provköra den textbaserade standard-Java-klienten och servern.
Zip-filer finns i
lektion 9.
Installera och kör servern på din egen maskin.
Kör servern i ett separat fönster, och koppla upp dig mot den med först en och sen flera klienter.
Undersök hur chat-systemet fungerar, och hur protokollet mellan klient och server ser ut.
-
Jag kommer att köra en chat-server som lyssnar på port 2001
på basen.oru.se.
Den färdiga chat-klienten ska koppla upp sig mot den servern.
Provkör mot den (med reservation för att den kanske inte alltid är igång),
men under utvecklingen kan det vara enklare att provköra mot en egen, lokal server.
Men ser tydligare vad som händer.
-
Skapa därefter en Android-app som kopplar upp sig mot servern,
och som fungerar på liknande sätt som den textbaserade standard-Java-klienten.
-
Provkör mot basen.oru.se-servern innan ni skickar in lösningen!
Tips
-
Man behöver skapa (minst) en extra tråd i Android-appen,
på samma sätt som i den textbaserade klienten.
-
I textbaserade program har man en "huvudtråd", den som kör metoden main.
I system med grafiskt gränssnitt har man också en "huvudtråd",
men i sådana system är detta tråden som ansvarar för att rita upp fönster och knappar.
Om den tråden jobbar med något annat,
till exempel att koppla upp sig mot en server eller vänta på data från den servern,
"fryser" hela användargränssnittet,
och det ser ut som att appen hängt sig.
I nyare versioner av Android (API-nivå 11 och högre) är det som default förbjudet att göra så,
och om man försöker kastas ett
NetworkOnMainThreadException.
-
Läs på om "UI-tråden" ("user interface-tråden") i Android,
till exempel här:
Painless threading.
-
Läs också
dokumentet
Designing for Responsiveness!
-
Det är bara UI-tråden som får ändra på det visade gränssnittet,
till exempel ändra texten i en textruta.
Om en annan tråd, till exempel en uppkopplingstråd eller en serverlyssnartråd,
vill lägga till text i textrutan,
måste den på något sätt lämna över det till UI-tråden.
-
Några bra ord att söka efter:
klasserna android.os.Handler, android.os.Message och android.os.AsyncTask
-
Glöm inte att appen måste ha rättighet att använda nätet (android.permission.INTERNET).
-
Namnet "localhost" betyder "den lokala maskinen".
Det gäller även en telefon eller annan Android-enhet.
Om man från en Android-app försöker koppla upp sig mot "localhost",
försöker man alltså koppla upp sig från telefonen och tillbaka till telefonen.
Samma sak gäller om "telefonen" är en emulator.
Om man kör en Android-app i en emulator,
och vill koppla upp sig mot en server man har igång på samma dator som man sitter vid,
ska emulatorn koppla upp sig mot den datorns IP-adress, inte mot localhost, för inuti emulatorn är
localhost alltså emulatorn själv.
-
Det är praktiskt att kunna skriva på datorns vanliga tangentbord för att mata in text
i textfälten i emulatorn. Från
Stack Overflow:
Even though the developer documentation says keyboard support is enabled by default
it doesn't seem to be that way in SDK rev 20.
I explicitly enabled keyboard support in my emulator's config.ini file and that worked!
Add: hw.keyboard=yes
To: ~/.android/avd/<emulator-device-name>.avd/config.ini
Reference:
http://developer.android.com/tools/devices/managing-avds-cmdline.html#hardwareopts
-
Servern svarar inte något till den klient som skickar en chat-rad,
utan vidarebefordrar den bara till de andra klienterna.
-
Det verkar finnas ett fel i servern som gör att den hänger sig ibland.
Klienter kan ansluta och skicka chat-rader,
men de raderna skickas inte vidare till de andra klienterna.
Ska fixas så fort jag hinner.
Redovisning
Packa ihop hela Eclipse-projektet (eller motsvarande) som en Zip-fil (eller motsvarande)
och skicka den med e-post till läraren.
APK-filen (Androids kompilerade installationsfil) ska vara med.
Den finns normalt i underkatalogen
app/build/outputs/apk.
Vi har haft problem med överambitiösa virusfilter,
och för att överlista dem kan man döpa om Zip-filen från nånting.zip
till exempelvis nånting.info (inte nånting.txt).
Om samarbete:
Varje student ska göra en egen lösning, och skicka in den,
men det är inte förbjudet att samarbeta eller fråga andra studenter om hjälp.
Däremot ska man i så fall tydligt ange vilka som man samarbetat med.
|
Skriv gärna i ärenderaden på brevet vilken kurs det handlar om,
till exempel "Android-uppgift 4", och inte bara "Uppgift 4".
|
Tillbaka till lektionslistan
Thomas Padron-McCarthy
(thomas.padron-mccarthy@oru.se),
10 oktober 2016