Tillbaka till lektionslistan

Mobila applikationer med Android: Inlämningsuppgift 4

Meningen med den här uppgiften är:

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:

En grafisk chat-klient i Android

Ha gärna möjlighet att logga in och logga ut också.

Förslag på arbetsgång

  1. 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.
  2. Jag kommer att köra en chat-server som lyssnar på port 2001basen.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.
  3. 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.
  4. Provkör mot basen.oru.se-servern innan ni skickar in lösningen!

Tips

  1. Man behöver skapa (minst) en extra tråd i Android-appen, på samma sätt som i den textbaserade klienten.
  2. 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.
  3. Läs på om "UI-tråden" ("user interface-tråden") i Android, till exempel här: Painless threading.
  4. Läs också dokumentet Designing for Responsiveness!
  5. 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.
  6. Några bra ord att söka efter: klasserna android.os.Handler, android.os.Message och android.os.AsyncTask
  7. Glöm inte att appen måste ha rättighet att använda nätet (android.permission.INTERNET).
  8. 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.
  9. 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

  10. Servern svarar inte något till den klient som skickar en chat-rad, utan vidarebefordrar den bara till de andra klienterna.
  11. 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 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, som utan att meddela det kastar bort mail med stora bilagor! Det gäller särskilt Microsoft-drivna e-posttjänster som Outlook.com, Hotmail.com och Live.com. Enkla brev utan bilagor brukar fungera, men när det gäller inlämning av uppgifter i den här kursen, som kräver att man skickar in Android-projekt, så blir det stora filer att skicka, och då rekommenderar jag att man använder en lagringstjänst som till exempel Google Drive, och skickar en länk dit med e-post. Man kan också använda Blackboard. Om du inte får svar så skicka gärna ett extra brev (utan bilaga!) för att kontrollera om det första brevet kom fram.

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), 12 januari 2018