Skip to content

10. Anexos

Apresentamos aqui como instalar as ferramentas utilizadas neste documento em computadores com Windows 7 a 10. O leitor deverá adaptar-se ao seu próprio ambiente.

10.1. Instalação de um JDK

Encontrar-se-á no URL o [http://www.oracle.com/technetwork/java/javase/downloads/index.html] (abril de 2016), o JDK mais recente. A partir de agora, designaremos por <jdk-install> a pasta de instalação do JDK.

 

10.2. Instalação do SDK Android Manager

 
  • no [1], por que é necessário o SDK do Android;

O Gestor do Android SDK pode ser encontrado no endereço [https://developer.android.com/studio/index.html#downloads] (maio de 2016).

 

Efetue a instalação do SDK Manager. Passaremos a referir-nos ao seu diretório de instalação como <sdk-manager-install>. Execute-o.

O projeto foi configurado para (ver parágrafo 9.3.2):

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

Certifique-se de que descarregou estes elementos.

10.3. Instalação do gestor de emuladores Genymotion

Os emuladores fornecidos com o SDK do Android são lentos, o que desmotiva a sua utilização. A empresa [Genymotion] disponibiliza um emulador de alto desempenho. Este está disponível no URL [https://cloud.genymotion.com/page/launchpad/download/] (maio de 2016).

Terá de se registar para obter uma versão para uso pessoal. Descarregue o produto [Genymotion] com a máquina virtual VirtualBox:

Image

A partir de agora, chamaremos de <genymotion-install> a pasta de instalação do [Genymotion]. Inicie o [Genymotion]. Em seguida, descarregue uma imagem para um tablet:

 
  • em [1], adicione o terminal virtual descrito em [2];

10.4. Instalação do IDE IntellijIDEA Community Edition

O IDE [ Intellij IDEA Community Edition] está disponível no URL [https://www.jetbrains.com/idea/#chooseYourEdition]:

 

Instale o IDE e, em seguida, execute-o.

  • no [1-2], configure os plugins;
  • no [3-4], adicione ao IDE o plugin [Genymotion];
 
  • em [6-7], configure o IDE;
  • em [8-9], indique a pasta de instalação do gestor de emuladores [Genymotion];
  • em [12-13], configura-se o tipo predefinido dos projetos;
 
  • em [14-16], configura-se o JDK;
 
  • no [17-20], configura-se o SDK do Android;
 
  • em [21-22], indica-se o JDK como predefinição dos projetos;
 
  • em [23-27], desativa-se a correção ortográfica, que por predefinição está configurada para a língua inglesa;
  • em [28-32], escolha o tipo de atalhos de teclado que desejar. Pode manter o predefinido do IntelliJ ou escolher o de outro IDE com o qual esteja mais habituado;
 
  • em [33-35], configure o IDE para vários projetos. Pode gerir vários projetos na mesma janela ou em janelas diferentes;
 
  • no [36-37], por predefinição, numere as linhas. Isto permitir-lhe-á localizar rapidamente a linha que provocou uma exceção;

10.5. Utilização dos exemplos

Os projetos IntellijIDEA dos exemplos estão disponíveis |ICI|. O parágrafo 1.3 explica como os abrir.

10.6. Gestão do jSON « » em Java

De forma transparente para o programador, o framework [Spring MVC] utiliza a biblioteca JSON [Jackson]. Para ilustrar o que é o JSON (JavaScript Object Notation), apresentamos aqui um programa que serializa objetos em JSON e faz o inverso, deserializando as cadeias JSON produzidas para recriar os objetos iniciais.

A biblioteca «Jackson» permite construir:

  • a cadeia JSON de um objeto: new ObjectMapper().writeValueAsString(object);
  • um objeto a partir de uma cadeia JSON: new ObjectMapper().readValue(jsonString, Object.class).

Ambos os métodos podem lançar um IOException. Eis um exemplo.

  

O projeto acima é um projeto Maven com o seguinte ficheiro: [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>
  • linhas 12-16: a dependência que inclui a biblioteca «Jackson»;

A classe [Personne] é a seguinte:


package istia.st.json;

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

    // construtores
    public Personne() {

    }

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

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

    // getters e setters
...
}

A classe [Main] é a seguinte:


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 {
  // a ferramenta de serialização/deserialização
  static ObjectMapper mapper = new ObjectMapper();

  public static void main(String[] args) throws IOException {
    // criação de uma pessoa
    Personne paul = new Personne("Denis", "Paul", 40);
    // exibição de JSON
    String json = mapper.writeValueAsString(paul);
    System.out.println("Json=" + json);
    // instanciação de Pessoa a partir do JSON
    Personne p = mapper.readValue(json, Personne.class);
    // exibição de uma pessoa
    System.out.println("Personne=" + p);
    // uma tabela
    Personne virginie = new Personne("Radot", "Virginie", 20);
    Personne[] personnes = new Personne[]{paul, virginie};
    // exibição de JSON
    json = mapper.writeValueAsString(personnes);
    System.out.println("Json personnes=" + json);
    // dicionário
    Map<String, Personne> hpersonnes = new HashMap<String, Personne>();
    hpersonnes.put("1", paul);
    hpersonnes.put("2", virginie);
    // exibição de JSON
    json = mapper.writeValueAsString(hpersonnes);
    System.out.println("Json hpersonnes=" + json);
  }
}

A execução desta classe produz a seguinte saída no ecrã:

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

Do exemplo, destaca-se:

  • o objeto [ObjectMapper] necessário para as transformações JSON / Objeto: linha 11;
  • a transformação [Personne] --> JSON: linha 17;
  • a transformação JSON --> [Personne]: linha 20;
  • a exceção [IOException] lançada pelos dois métodos: linha 13.

Índice

1 Introdução 5

1.1Contexte 5

1.2Les ferramentas utilizadas 6

1.3Les códigos dos exemplos 6

2Um exemplo de introdução 9

2.1L «Arquitetura da aplicação de exemplo» 9

2.2L'executável 9

2.3L'interface síncrona 11

2.4L'chamada síncrona 12

2.5Tests: chamadas síncronas 13

2.6L «Interface assíncrona e a sua implementação» 14

2.7L «chamada assíncrona» 16

2.8Tests: chamadas assíncronas 19

2.8.1avec o agendador [Schedulers.io] 20

2.8.2avec o agendador [Schedulers.computation] 20

2.8.3avec o agendador [Schedulers.newThread] 21

2.8.4avec os programadores [Schedulers.trampoline, Schedulers.immediate] 22

2.9Cas limites 22

2.10Conclusion 24

3As assinaturas das classes e métodos genéricos 27

4As funções lambda do Java 8 32

4.1Exemple-01 - Interfaces funcionais e lambdas 32

4.2Exemple-02 - A interface funcional Predicate<T> 34

4.3Exemple-03 - a interface funcional Function<T,R> 37

4.4Exemple-04 - a interface funcional Consumer<T> 38

4.5Exemple-05 - a interface funcional BiConsumer<T,U> 40

4.6Exemple-06 - a interface funcional BiFunction<T,U,R> 41

4.7Exemple-07 - a interface funcional Supplier<T> 43

5O tipo Stream<T> do Java 8 45

5.1Exemple-01 - a classe Stream 45

5.2Exemple-02 - processamento paralelo dos elementos de um Stream 47

5.3Exemple-03 - processamento paralelo dos elementos de um Stream 48

5.4Exemple-04 - filtrar um Stream 50

5.5Exemple-05 - criar um Stream<T2> a partir de um Stream<T1> 52

5.6Exemple-06 - outros métodos da classe 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 Métodos de fluxo de números primitivos 71

6As interfaces funcionais da biblioteca RxJava 72

6.1Exemple-01: a interface funcional [Action0] 72

6.2Exemple-02, 03: a interface funcional [Actioni] 73

6.3Exemple-04, 05: a interface funcional [Funci] 74

7A biblioteca RxJava 77

7.1 Criar observáveis e subscrevê-los 77

7.1.1Exemple-01: o método [Observable.from] 77

7.1.2Exemple-03: a classe Observer 82

7.1.3Exemple-04: o método [Observable.create] 84

7.1.4Exemple-05: refatoração de [Exemple-04] 86

7.2Thread de execução, thread de observação 88

7.2.1Exemple-06: observável e observador num thread diferente de [main] 88

7.2.2Exemple-07: observável e observador em dois threads diferentes 90

7.3Observables predefinidos 92

7.3.1Exemple-08: o método [Observable.range] 92

7.3.2Exemple-09: os métodos Observable.[interval, take, doNext] 96

7.3.3Exemples-10/12: os métodos Observable.[error, empty, never] 98

7.4Multi-threading 102

7.4.1Exemple-13: thread de ação, thread de observação 103

7.5Combinaisons de vários observáveis 106

7.5.1Exemple-14: fundir dois observáveis com [Observable.merge] 106

7.5.2Exemple-15: concatenar duas variáveis observáveis com [Observable.concat] 108

7.5.3Exemple-16: combinar dois observáveis com [Observable.zip] 109

7.5.4Exemple-17: combinar dois observáveis com [Observable.combineLatest] 111

7.5.5Exemple-18: combinar dois observáveis com [Observable.amb] 113

7.6Cadeia de processamento de um observável 114

7.6.1Exemple-19: transformar um observável com [Observable.map] 114

7.6.2Exemple-20: filtrar um observável com [Observable.filter] 116

7.6.3Exemple-21: transformar um observável com [Observable.flapMap] 117

7.6.4Exemples-22: outros métodos da classe [Observable] 123

7.7Les: agendadores 127

7.7.1Exemple-23: o agendador [Schedulers.computation] 127

7.7.2Exemple-24: o programador [Schedulers.io] 128

7.7.3Exemple-25: o agendador [Schedulers.newThread] 129

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

7.8Conclusion 133

8RxJava no ambiente Swing 134

8.1Introduction 134

8.2La estrutura do código 135

8.3 Execução do projeto 136

8.4Le serviço síncrono 136

8.5Le serviço assíncrono 139

8.6L «interface gráfica» 141

8.7Instanciation da interface gráfica 143

8.8Execução de consultas síncronas 144

8.9 Execução de consultas assíncronas 145

9 RxJava no ambiente Android 149

9.1Introduction 149

9.2Le serviço web / jSON 149

9.2.1Le projeto IntelliJ IDEA 150

9.2.2Les dependências Gradle do projeto 151

9.2.3La camada [métier] 153

9.2.4Le serviço web / JSON 156

9.2.5Configuration do projeto Spring 160

9.2.6Execução do servidor web 161

9.3Le cliente Android 161

9.3.1RxAndroid 161

9.3.2Le projeto IntelliJ IDEA 162

9.3.3Execução do projeto IntelliJ IDEA 164

9.3.4Les Dependências Gradle do projeto 166

9.3.5Le Manifesto da aplicação Android 167

9.3.6La camada [DAO] 168

9.3.6.1L: interface [IDao] da camada [DAO] 168

9.3.6.2 Implementação da camada [DAO] 170

9.3.7Les: vistas da aplicação 172

9.3.7.1La classe [MyFragment] 174

9.3.7.2Le fragmento [RequestFragment] da consulta 176

9.3.7.3Le fragmento [ResponseFragment] da resposta 177

9.3.7.4L «atividade» Android [MainActivity] 178

9.3.7.5Le fragmento [RequestFragment] 185

9.3.7.6Le fragmento [ResponseFragment] 187

9.3.8Les exemplos de observáveis 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 continuar 202

9.3.9Conclusion 202

10Anexos 203

10.1Installation de um JDK 203

10.2Installation do SDK Gestor do Android 203

10.3Installation do gestor de emuladores Genymotion 204

10.4Installation do IDE IntellijIDEA Community Edition 205

10.5Utilisation dos exemplos 210

10.6Gestion do jSON em Java 211