Skip to content

10. Bijlagen

Hier wordt uitgelegd hoe de in dit document gebruikte tools op Windows 7- tot 10-computers kunnen worden geïnstalleerd. De lezer dient dit aan te passen aan zijn eigen omgeving.

10.1. Installatie van een JDK

Op de URL is de [http://www.oracle.com/technetwork/java/javase/downloads/index.html] (april 2016) te vinden, de meest recente versie van de JDK. We zullen de installatiemap van de JDK hierna <jdk-install> noemen.

 

10.2. Installatie van de Android Manager SDK

 
  • in [1], waarom hebben we de Android-versie SDK nodig;

De SDK Android Manager is te vinden op het adres [https://developer.android.com/studio/index.html#downloads] (mei 2016).

 

Installeer de SDK Manager. We zullen de installatiemap hierna aanduiden als <sdk-manager-install>. Start het programma.

Het project is geconfigureerd voor (zie paragraaf 9.3.2):

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

Zorg ervoor dat u deze onderdelen hebt gedownload.

10.3. Installatie van de Genymotion-emulatormanager

De emulators die bij de SDK van Android worden geleverd, zijn traag, wat het gebruik ervan ontmoedigt. Het bedrijf [Genymotion] biedt een krachtige emulator aan. Deze is beschikbaar via de URL [https://cloud.genymotion.com/page/launchpad/download/] (mei 2016).

U moet zich registreren om een versie voor persoonlijk gebruik te verkrijgen. Download het product [Genymotion] samen met de virtuele machine VirtualBox:

Image

We zullen de installatiemap van [Genymotion] hierna <genymotion-install> noemen. Start [Genymotion]. Download vervolgens een image voor een tablet:

 
  • in [1], voeg de virtuele terminal toe die wordt beschreven in [2];

10.4. Installatie van de IDE IntellijIDEA Community Edition

De IDE [ Intellij IDEA Community Edition] is beschikbaar in de URL [https://www.jetbrains.com/idea/#chooseYourEdition]:

 

Installeer de IDE en start het programma vervolgens op.

  • in [1-2], configureer de plug-ins;
  • in [3-4], voeg de plug-in [Genymotion] toe aan IDE;
 
  • in [6-7], configureer IDE;
  • in [8-9], geef de installatiemap van de emulatorbeheerder [Genymotion] op;
  • in [12-13] wordt de standaardtype van de projecten geconfigureerd;
 
  • in [14-16] wordt JDK geconfigureerd;
 
  • in [17-20], configureer je de SDK van Android;
 
  • in [21-22] wordt de standaardinstelling JDK voor projecten opgegeven;
 
  • in [23-27] wordt de spellingcontrole uitgeschakeld, die standaard is ingesteld voor de Engelse taal;
  • in [28-32] kiest u het type sneltoetsen dat u wilt gebruiken. U kunt de standaardinstelling van IntelliJ behouden of die van een andere IDE kiezen waaraan u meer gewend bent;
 
  • in [33-35], stel de IDE in voor meerdere projecten. Het kan meerdere projecten in hetzelfde venster of in verschillende vensters beheren;
 
  • in [36-37]: nummer de regels standaard. Zo kunt u snel de regel terugvinden die een uitzondering heeft veroorzaakt;

10.5. Gebruik van de voorbeelden

De voorbeeldprojecten IntellijIDEA zijn beschikbaar |ICI|. In paragraaf 1.3 wordt uitgelegd hoe u deze kunt openen.

10.6. Beheer van de jSON- -in Java

Op een voor de ontwikkelaar transparante manier maakt het [Spring MVC]-framework gebruik van de JSON-bibliotheek [Jackson]. Om te illustreren wat JSON (JavaScript Object Notation) is, presenteren we hier een programma dat objecten serialiseert naar JSON en het omgekeerde doet door de gegenereerde JSON-strings te deserialiseren om de oorspronkelijke objecten te reconstrueren.

Met de bibliotheek 'Jackson' kun je:

  • de JSON-string van een object: new ObjectMapper().writeValueAsString(object);
  • een object op basis van een tekenreeks JSON: new ObjectMapper().readValue(jsonString, Object.class).

Beide methoden kunnen een IOException starten. Hier volgt een voorbeeld.

  

Het bovenstaande project is een Maven-project met het volgende bestand: [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>
  • regels 12-16: de afhankelijkheid die de bibliotheek 'Jackson' binnenhaalt;

De klasse [Personne] ziet er als volgt uit:


package istia.st.json;

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

    // constructors
    public Personne() {

    }

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

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

    // getters en setters
...
}

De klasse [Main] is als volgt:


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 {
  // de tool voor serialisatie/deserialisatie
  static ObjectMapper mapper = new ObjectMapper();

  public static void main(String[] args) throws IOException {
    // een persoon aanmaken
    Personne paul = new Personne("Denis", "Paul", 40);
    // JSON weergeven
    String json = mapper.writeValueAsString(paul);
    System.out.println("Json=" + json);
    // Person instantiëren op basis van JSON
    Personne p = mapper.readValue(json, Personne.class);
    // weergave van een persoon
    System.out.println("Personne=" + p);
    // een array
    Personne virginie = new Personne("Radot", "Virginie", 20);
    Personne[] personnes = new Personne[]{paul, virginie};
    // JSON weergeven
    json = mapper.writeValueAsString(personnes);
    System.out.println("Json personnes=" + json);
    // woordenboek
    Map<String, Personne> hpersonnes = new HashMap<String, Personne>();
    hpersonnes.put("1", paul);
    hpersonnes.put("2", virginie);
    // JSON weergeven
    json = mapper.writeValueAsString(hpersonnes);
    System.out.println("Json hpersonnes=" + json);
  }
}

Het uitvoeren van deze klasse leidt tot de volgende schermweergave:

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}}

Uit het voorbeeld onthouden we het volgende:

  • het object [ObjectMapper] dat nodig is voor de transformaties JSON / Object: regel 11;
  • de transformatie [Personne] --> JSON: regel 17;
  • de transformatie JSON --> [Personne]: regel 20;
  • de uitzondering [IOException] die door beide methoden wordt gegenereerd: regel 13.

Inhoudsopgave

1Inleiding 5

1.1Contexte 5

1.2Les gebruikte gereedschappen 6

1.3Les codes van de voorbeelden 6

2Een inleidend voorbeeld 9

2.1L De architectuur van de voorbeeldtoepassing 9

2.2L'het uitvoerbare bestand 9

2.3L'synchrone interface 11

2.4L'synchrone aanroep 12

2.5Tests synchrone oproepen 13

2.6L 'asynchrone interface en de implementatie ervan' 14

2.7L 'asynchrone aanroep' 16

2.8Tests: asynchrone aanroepen 19

2.8.1avec de planner [Schedulers.io] 20

2.8.2avec de scheduler [Schedulers.computation] 20

2.8.3avec de planner [Schedulers.newThread] 21

2.8.4avec de planners [Schedulers.trampoline, Schedulers.immediate] 22

2.9Cas grenzen 22

2.10Conclusion 24

3De handtekeningen van generieke klassen en methoden 27

4Lambda-functies in Java 8 32

4.1Exemple-01 - Functionele interfaces en lambda's 32

4.2Exemple-02 - De functionele interface Predicate<T> 34

4.3Exemple-03 - De functionele interface Function<T,R> 37

4.4Exemple-04 - de functionele interface Consumer<T> 38

4.5Exemple-05 - de functionele interface BiConsumer<T,U> 40

4.6Exemple-06 - de functionele interface BiFunction<T,U,R> 41

4.7Exemple-07 - de functionele interface Supplier<T> 43

5Het type Stream<T> in Java 8 45

5.1Exemple-01 - de klasse Stream 45

5.2Exemple-02 - parallelle verwerking van elementen in een Stream 47

5.3Exemple-03 - parallelle verwerking van de elementen van een Stream 48

5.4Exemple-04 - een stream filteren 50

5.5Exemple-05 - een Stream<T2> aanmaken op basis van een Stream<T1> 52

5.6Exemple-06 - andere methoden van de klasse 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.13Methoden voor de stroom van priemgetallen 71

6De functionele interfaces van de bibliotheek RxJava 72

6.1Exemple-01: de functionele interface [Action0] 72

6.2Exemple-02, 03: de functionele interface [Actioni] 73

6.3Exemple-04, 05: de functionele interface [Funci] 74

7De bibliotheek RxJava 77

7.1 Observables aanmaken en je erop abonneren 77

7.1.1Exemple-01: de methode [Observable.from] 77

7.1.2Exemple-03: de klasse Observer 82

7.1.3Exemple-04: de methode [Observable.create] 84

7.1.4Exemple-05: refactoring van [Exemple-04] 86

7.2Thread uitvoering, observatiethread 88

7.2.1Exemple-06: observable en observer in een andere thread dan [main] 88

7.2.2Exemple-07: observabel en waarnemer in twee verschillende threads 90

7.3Observables vooraf gedefinieerd 92

7.3.1Exemple-08: de methode [Observable.range] 92

7.3.2Exemple-09: de methoden van Observable.[interval, take, doNext] 96

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

7.4Multi-threading 102

7.4.1Exemple-13: actiethread, observatiethread 103

7.5Combinaisons van meerdere observabelen 106

7.5.1Exemple-14: twee observabelen samenvoegen met [Observable.merge] 106

7.5.2Exemple-15: twee observables samenvoegen met [Observable.concat] 108

7.5.3Exemple-16: twee observables combineren met [Observable.zip] 109

7.5.4Exemple-17: twee observables combineren met [Observable.combineLatest] 111

7.5.5Exemple-18: twee observabelen combineren met [Observable.amb] 113

7.6Verwerkingsketen van een observable 114

7.6.1Exemple-19: een observable transformeren met [Observable.map] 114

7.6.2Exemple-20: een observable filteren met [Observable.filter] 116

7.6.3Exemple-21: een observable transformeren met [Observable.flapMap] 117

7.6.4Exemples-22: andere methoden van de klasse [Observable] 123

7.7Les-planners 127

7.7.1Exemple-23: de planner [Schedulers.computation] 127

7.7.2Exemple-24: de planner [Schedulers.io] 128

7.7.3Exemple-25: de planner [Schedulers.newThread] 129

7.7.4Exemple-26: de planningsprogramma's [Schedulers.immediate, Schedulers.trampoline] 130

7.8Conclusion 133

8RxJava in de Swing-omgeving 134

8.1Introduction 134

8.2La codestructuur 135

8.3 Uitvoering van het project 136

8.4Le synchrone service 136

8.5Le asynchrone service 139

8.6L grafische interface 141

8.7Instanciation van de grafische interface 143

8.8 Uitvoering van synchrone verzoeken 144

8.9 Uitvoering van asynchrone verzoeken 145

9 RxJava in de Android-omgeving 149

9.1Introduction 149

9.2Le webservice / jSON 149

9.2.1Le IntelliJ Idea-project 150

9.2.2Les Gradle-afhankelijkheden van het project 151

9.2.3La laag [métier] 153

9.2.4Le webservice / JSON 156

9.2.5Configuration van het Spring-project 160

9.2.6 De webserver uitvoeren 161

9.3Le Android-client 161

9.3.1RxAndroid 161

9.3.2Le IntelliJ Idea-project 162

9.3.3 Het IntelliJ Idea-project uitvoeren 164

9.3.4Les Gradle-afhankelijkheden van het project 166

9.3.5Le Android-applicatiemanifest 167

9.3.6La laag [DAO] 168

9.3.6.1L-interface van de laag [DAO] 168

9.3.6.2 Implementatie van de laag [DAO] 170

9.3.7Les-weergaven van de applicatie 172

9.3.7.1La klasse [MyFragment] 174

9.3.7.2Le fragment [RequestFragment] van de aanvraag 176

9.3.7.3Le fragment [ResponseFragment] van het antwoord 177

9.3.7.4L de Android-activiteit [MainActivity] 178

9.3.7.5Le fragment [RequestFragment] 185

9.3.7.6Le fragment [ResponseFragment] 187

9.3.8Les voorbeelden van meetgrootheden 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 verder 202

9.3.9Conclusion 202

10Bijlagen 203

10.1Installation van een JDK 203

10.2Installation van de SDK Android Manager 203

10.3Installation van de Genymotion-emulatorbeheerder 204

10.4Installation van de IDE IntellijIDEA Community Edition 205

10.5Utilisation uit de voorbeelden 210

10.6Gestion van de jSON in Java 211