Odjazd – prowizoryczny klient – #02

Mam już działający serwer, który potrafi wysłać jsona w świat. Trzeba mi teraz czegoś co odbierze tego jsona i wyświetli użytkownikowi. Czas na prowizorycznego klienta. Choć to prowizorka, to powinien naprawdę komunikować się z serwerem, a nie tylko to udawać.

Żeby aplikacja mogła się połączyć z internetem trzeba jej przyznać w manifeście odpowiednie uprawnienia:


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.projects.jezinka.odjazd_client">
<uses-permission android:name="android.permission.INTERNET" />
<application
(…)

Dodanie odpowiedniego uprawnienia to nie jedyne o czym trzeba pamiętać przy tworzeniu aplikacji, która łączy się z internetem. Druga rzecz to fakt, że zapytanie nie może się wywoływać w głównym wątku. Żeby zaspokoić tą potrzebę trzeba stworzyć asynchroniczny task, który odpyta serwer poza głównym wątkiem:


private class OdjazdQueryTask extends AsyncTask<URL, Void, String> {
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
if (s != null) {
mTextView.setText(s);
}
}
@Override
protected String doInBackground(URL… urls) {
URL url = urls[0];
return makeOdjazdQuery(url);
}
}

Tworzę klasę OdjazdQueryTask (wplatam nazwę aplikacji, bo mogę 😉 ), która rozszerza AsyncTask, z paramterem typu URL na wejściu i Stringiem na wyjściu. Środkowy parameter jest typem Void, bo nie wykorzystuję metody onProgressUpdate. Metoda onPostExecute wykonuje się w momencie zakończenia taska i wstawia mi wynik zapytania do textView. Druga metoda doInBackground wykonuje zapytanie do serwera dla podanego Url-a:


private String makeOdjazdQuery(URL url) {
if (url != null) {
try {
return getResponseFromHttpUrl(url);
} catch (IOException e) {
e.printStackTrace();
}
}
return "";
}
private static String getResponseFromHttpUrl(URL url) throws IOException {
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
InputStream in = urlConnection.getInputStream();
Scanner scanner = new Scanner(in);
scanner.useDelimiter("\\A");
boolean hasInput = scanner.hasNext();
if (hasInput) {
return scanner.next();
} else {
return null;
}
} finally {
urlConnection.disconnect();
}
}

Layout mojej aplikacji, to dwa przyciski i textview. Na ten moment to mi wystarczy. Trzeba podpiąć pod przycisk odpowiednią akcję, która wyzwoli zapytanie do serwera:


public void workButtonClick(View view) {
URL workUrl = createUrl(WORK_PARAM);
new OdjazdQueryTask().execute(workUrl);
}

Tworzę nową instancję klasy OdjazdQueryTask i wywołuję ją z paramentrem URL stworzonym dla początku startowego 'praca’.


private URL createUrl(String param) {
Uri builtUri = Uri.parse(ODJAZD_SERVER_URL).buildUpon().appendQueryParameter(PARAM_FROM, param).build();
URL url = null;
try {
url = new URL(builtUri.toString());
} catch (MalformedURLException e) {
e.printStackTrace();
}
return url;
}

I teraz krótka demonstracja jak zachowuje się aplikacja po wciśnięciu każdego z przycisków:

Jak na razie wszystko w najlepszym porządku 🙂

Kod dostępny tu: https://github.com/jezinka/Odjazd-client

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

This site uses Akismet to reduce spam. Learn how your comment data is processed.