Skip to content

10. Załączniki

Poniżej przedstawiamy sposób instalacji narzędzi wykorzystanych w niniejszym dokumencie na komputerach z systemem Windows 7–10. Czytelnik powinien dostosować instrukcje do własnego środowiska.

10.1. Instalacja JDK

W URL (kwiecień 2016 r.) znajduje się najnowsza wersja [http://www.oracle.com/technetwork/java/javase/downloads/index.html]. W dalszej części folder instalacyjny JDK będziemy nazywać <jdk-install>.

 

10.2. Instalacja menedżera Androida SDK

 
  • w [1], dlaczego potrzebujemy SDK dla Androida;

Menedżer Androida o numerze SDK można znaleźć pod adresem [https://developer.android.com/studio/index.html#downloads] (maj 2016 r.).

 

Zainstaluj program SDK Manager. Jego katalog instalacyjny oznaczymy dalej jako <sdk-manager-install>. Uruchom program.

Projekt został skonfigurowany dla (patrz punkt 9.3.2):

  • SDK API 23 [2];
  • SDK Build-tools 23.0.3 [3];
  • SDK Tool 25.1.3 [4]

Upewnij się, że pobrałeś te elementy.

10.3. Instalacja menedżera emulatorów Genymotion

Emulatory dostarczane wraz z systemem Android SDK działają wolno, co zniechęca do ich używania. Firma [Genymotion] oferuje wydajny emulator. Jest on dostępny w wersji URL [https://cloud.genymotion.com/page/launchpad/download/] (maj 2016 r.).

Aby uzyskać wersję do użytku osobistego, należy się zarejestrować. Pobierz produkt [Genymotion] wraz z maszyną wirtualną VirtualBox:

Image

Od tej pory folder instalacyjny [Genymotion] będziemy nazywać <genymotion-install>. Uruchom plik [Genymotion]. Następnie pobierz obraz dla tabletu:

 
  • w pliku [1], dodaj terminal wirtualny opisany w pliku [2];

10.4. Instalacja IDE IntellijIDEA Community Edition

IDE [ Intellij IDEA Community Edition] jest dostępny w URL [https://www.jetbrains.com/idea/#chooseYourEdition]:

 

Zainstaluj IDE, a następnie uruchom go.

  • w pliku [1-2] skonfiguruj wtyczki;
  • w [3-4] dodaj do IDE wtyczkę [Genymotion];
 
  • w pliku [6-7] skonfiguruj plik IDE;
  • na [8-9], należy wskazać folder instalacyjny menedżera emulatorów [Genymotion];
  • w pliku [12-13] należy skonfigurować domyślny typ projektów;
 
  • w pliku [14-16] konfiguruje się plik JDK;
 
  • w [17-20] konfiguruje się SDK dla systemu Android;
 
  • w pliku [21-22] określa się domyślny plik JDK dla projektów;
 
  • w pliku [23-27] wyłączamy sprawdzanie pisowni, które domyślnie jest ustawione dla języka angielskiego;
  • w pliku [28-32] wybierz żądany typ skrótów klawiszowych. Możesz zachować domyślne ustawienia IntelliJ lub wybrać te z innego pliku IDE, do których jesteś bardziej przyzwyczajony;
 
  • w [33-35] skonfiguruj IDE pod kątem pracy z wieloma projektami. Może on obsługiwać kilka projektów w tym samym oknie lub w różnych oknach;
 
  • w [36-37] domyślnie numeruj wiersze. Pozwoli to szybko znaleźć wiersz, który spowodował wyjątek;

10.5. Korzystanie z przykładów

Przykładowe projekty IntellijIDEA są dostępne w |ICI|. W punkcie 1.3 wyjaśniono, jak je otworzyć.

10.6. Obsługa jSON w Javie

W sposób przezroczysty dla programisty framework [Spring MVC] wykorzystuje bibliotekę JSON [Jackson]. Aby zilustrować, czym jest JSON (JavaScript Object Notation), przedstawiamy tutaj program, który serializuje obiekty do formatu JSON oraz wykonuje odwrotną operację, deserializując wygenerowane ciągi znaków JSON w celu odtworzenia pierwotnych obiektów.

Biblioteka „Jackson” umożliwia utworzenie:

  • ciąg znaków JSON dla obiektu: new ObjectMapper().writeValueAsString(object);
  • obiektu na podstawie ciągu znaków JSON: new ObjectMapper().readValue(jsonString, Object.class).

Obie metody mogą wywołać błąd IOException. Oto przykład.

  

Powyższy projekt to projekt Maven zawierający następujący plik [pom.xml]:


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>istia.st</groupId>
  <artifactId>json</artifactId>
  <version>1.0-SNAPSHOT</version>

  <dependencies>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.3.3</version>
    </dependency>
  </dependencies>
</project>
  • wiersze 12–16: zależność, która ładuje bibliotekę „Jackson”;

Klasa [Personne] ma następującą postać:


package istia.st.json;

public class Personne {
    // dane
    private String nom;
    private String prenom;
    private int age;

    // konstruktory
    public Personne() {

    }

    public Personne(String nom, String prénom, int âge) {
        this.nom = nom;
        this.prenom = prénom;
        this.age = âge;
    }

    // sygnatura
    public String toString() {
        return String.format("Personne[%s, %s, %d]", nom, prenom, age);
    }

    // metody pobierające i ustawiające
...
}

Klasa [Main] ma następującą postać:


package istia.st.json;

import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class Main {
  // narzędzie do serializacji / deserializacji
  static ObjectMapper mapper = new ObjectMapper();

  public static void main(String[] args) throws IOException {
    // tworzenie osoby
    Personne paul = new Personne("Denis", "Paul", 40);
    // wyświetlanie JSON
    String json = mapper.writeValueAsString(paul);
    System.out.println("Json=" + json);
    // instancjonowanie obiektu Personne na podstawie danych JSON
    Personne p = mapper.readValue(json, Personne.class);
    // wyświetlanie osoby
    System.out.println("Personne=" + p);
    // tablica
    Personne virginie = new Personne("Radot", "Virginie", 20);
    Personne[] personnes = new Personne[]{paul, virginie};
    // wyświetlanie JSON
    json = mapper.writeValueAsString(personnes);
    System.out.println("Json personnes=" + json);
    // słownik
    Map<String, Personne> hpersonnes = new HashMap<String, Personne>();
    hpersonnes.put("1", paul);
    hpersonnes.put("2", virginie);
    // wyświetlanie JSON
    json = mapper.writeValueAsString(hpersonnes);
    System.out.println("Json hpersonnes=" + json);
  }
}

Wykonanie tej klasy powoduje wyświetlenie następującego ekranu:

1
2
3
4
Json={"nom":"Denis","prenom":"Paul","age":40}
Personne=Personne[Denis, Paul, 40]
Json personnes=[{"nom":"Denis","prenom":"Paul","age":40},{"nom":"Radot","prenom":"Virginie","age":20}]
Json hpersonnes={"2":{"nom":"Radot","prenom":"Virginie","age":20},"1":{"nom":"Denis","prenom":"Paul","age":40}}

Z przykładu należy zapamiętać:

  • obiekt [ObjectMapper] niezbędny do transformacji JSON / Object: wiersz 11;
  • transformację [Personne] → JSON: wiersz 17;
  • transformację JSON → [Personne]: wiersz 20;
  • wyjątek [IOException] wywołany przez obie metody: wiersz 13.

Spis treści

1 Wprowadzenie 5

1.1Contexte 5

1.2Les wykorzystane narzędzia 6

1.3Les kody przykładów 6

2Przykładowe wprowadzenie 9

2.1L – architektura przykładowej aplikacji 9

2.2L – plik wykonywalny 9

2.3L „Interfejs synchroniczny” 11

2.4L „wywołanie synchroniczne” 12

2.5Tests – wywołania synchroniczne 13

2.6L – interfejs asynchroniczny i jego implementacja 14

2.7L „wywołanie asynchroniczne” 16

2.8Tests – wywołania asynchroniczne 19

2.8.1avec harmonogram [Schedulers.io] 20

2.8.2avec harmonogram [Schedulers.computation] 20

2.8.3avec harmonogram [Schedulers.newThread] 21

2.8.4avec harmonogramy [Schedulers.trampoline, Schedulers.immediate] 22

2.9Cas ograniczenia 22

2.10Conclusion 24

3Sygnatury klas i metod generycznych 27

4Funkcje lambda w Javie 8 32

4.1Exemple-01 – Interfejsy funkcjonalne i lambda 32

4.2Exemple-02 – interfejs funkcjonalny Predicate<T> 34

4.3Exemple-03 – interfejs funkcjonalny Function<T,R> 37

4.4Exemple-04 – interfejs funkcjonalny Consumer<T> 38

4.5Exemple-05 – interfejs funkcjonalny BiConsumer<T,U> 40

4.6Exemple-06 – interfejs funkcjonalny BiFunction<T,U,R> 41

4.7Exemple-07 – interfejs funkcjonalny Supplier<T> 43

5Typ Stream<T> w Javie 8 45

5.1Exemple-01 – klasa Stream 45

5.2Exemple-02 – równoległe przetwarzanie elementów strumienia 47

5.3Exemple-03 – równoległe przetwarzanie elementów strumienia 48

5.4Exemple-04 – filtrowanie strumienia 50

5.5Exemple-05 – tworzenie strumienia <T2> na podstawie strumienia <T1> 52

5.6Exemple-06 – inne metody klasy Stream<T> 53

5.6.1[findFirst] 54

5.6.2[findAny] 55

5.6.3[skip] 56

5.6.4[limit] 58

5.6.5[count] 59

5.6.6[max, min] 60

5.6.7[reduce] 63

5.6.8[sorted] 63

5.6.9[anyMatch, noneMatch, allMatch] 65

5.6.10[collect(Collectors.groupingBy)] 65

5.6.11[distinct] 67

5.6.12[flatMap] 68

5.6.13 Metody przepływu liczb pierwotnych 71

6Interfejsy funkcjonalne biblioteki RxJava 72

6.1Exemple-01: interfejs funkcjonalny [Action0] 72

6.2Exemple-02, 03: interfejs funkcjonalny [Actioni] 73

6.3Exemple-04, 05: interfejs funkcjonalny [Funci] 74

7Biblioteka RxJava 77

7.1 Tworzenie obserwowalnych i subskrybowanie ich 77

7.1.1Exemple-01: metoda [Observable.from] 77

7.1.2Exemple-03: klasa Observer 82

7.1.3Exemple-04: metoda [Observable.create] 84

7.1.4Exemple-05: refaktoryzacja klasy [Exemple-04] 86

7.2Thread – wdrażanie, wątek obserwacyjny 88

7.2.1Exemple-06: obserwowalny i obserwator w wątku innym niż [main] 88

7.2.2Exemple-07: obserwowalna i obserwator w dwóch różnych wątkach 90

7.3Observables – wartości domyślne 92

7.3.1Exemple-08: metoda [Observable.range] 92

7.3.2Exemple-09: metody Observable.[interval, take, doNext] 96

7.3.3Exemples-10/12: metody Observable.[error, empty, never] 98

7.4Multi-threading 102

7.4.1Exemple-13: wątek akcji, wątek obserwacji 103

7.5Combinaisons dla wielu obserwowalnych wielkości 106

7.5.1Exemple-14: połączenie dwóch obserwowalnych z [Observable.merge] 106

7.5.2Exemple-15: połączenie dwóch obserwowalnych z [Observable.concat] 108

7.5.3Exemple-16: połączenie dwóch obserwowalnych z [Observable.zip] 109

7.5.4Exemple-17: połączenie dwóch obserwowalnych z [Observable.combineLatest] 111

7.5.5Exemple-18: połączenie dwóch wielkości obserwowalnych z [Observable.amb] 113

7.6 Łańcuch przetwarzania zmiennej obserwowalnej 114

7.6.1Exemple-19: przekształcanie obserwowalnej za pomocą [Observable.map] 114

7.6.2Exemple-20: filtrowanie obserwowalnej za pomocą [Observable.filter] 116

7.6.3Exemple-21: przekształcanie obserwowalnej wartości za pomocą [Observable.flapMap] 117

7.6.4Exemples-22: inne metody klasy [Observable] 123

7.7Les – harmonogramy 127

7.7.1Exemple-23: harmonogram [Schedulers.computation] 127

7.7.2Exemple-24: harmonogram [Schedulers.io] 128

7.7.3Exemple-25: harmonogram [Schedulers.newThread] 129

7.7.4Exemple-26: harmonogramy [Schedulers.immediate, Schedulers.trampoline] 130

7.8Conclusion 133

8RxJava w środowisku Swing 134

8.1Introduction 134

8.2La struktura kodu 135

8.3 Realizacja projektu 136

8.4Le usługa synchroniczna 136

8.5Le usługa asynchroniczna 139

8.6L „interfejs graficzny” 141

8.7Instanciation interfejsu graficznego 143

8.8. Wykonywanie zapytań synchronicznych 144

8.9 Wykonywanie zapytań asynchronicznych 145

9RxJava w środowisku Android 149

9.1Introduction 149

9.2Le usługa internetowa / jSON 149

9.2.1Le projekt IntelliJ Idea 150

9.2.2Les zależności Gradle projektu 151

9.2.3La warstwa [métier] 153

9.2.4Le usługa internetowa / JSON 156

9.2.5Configuration projektu Spring 160

9.2.6Uruchomienie serwera internetowego 161

9.3Le – klient na Androida 161

9.3.1RxAndroid 161

9.3.2Le projekt IntelliJ IDEA 162

9.3.3Uruchamianie projektu w IntelliJ IDEA 164

9.3.4Les – zależności projektu w Gradle 166

9.3.5Le manifest aplikacji na Androida 167

9.3.6La warstwa [DAO] 168

9.3.6.1L – interfejs [IDao] warstwy [DAO] 168

9.3.6.2. Implementacja warstwy [DAO] 170

9.3.7Les – widoki aplikacji 172

9.3.7.1La klasa [MyFragment] 174

9.3.7.2Le fragment zapytania [RequestFragment] 176

9.3.7.3Le fragment [ResponseFragment] odpowiedzi 177

9.3.7.4L – aktywność Androida [MainActivity] 178

9.3.7.5Le fragment [RequestFragment] 185

9.3.7.6Le fragment [ResponseFragment] 187

9.3.8Les przykłady wielkości obserwowalnych 190

9.3.8.1Exemple-01 190

9.3.8.2Exemple-02 193

9.3.8.3Exemple-03 195

9.3.8.4Exemple-04 197

9.3.8.5Exemple-05 198

9.3.8.6Pour kontynuuj 202

9.3.9Conclusion 202

10Załączniki 203

10.1Installation z JDK 203

10.2Installation z SDK – menedżer systemu Android 203

10.3Installation z menedżera emulatorów Genymotion 204

10.4Installation z IDE IntellijIDEA Community Edition 205

10.5Utilisation z przykładów 210

10.6Gestion z jSON w Javie 211