Slide 1

Slide 1 text

Na prática com Android Annotations, GreenDAO, EventBus e Crouton.

Slide 2

Slide 2 text

1. Conhecimento intermediário em Java; 2. Conhecimento básico em Android (configurar o ambiente de desenvolvimento / Android SDK / Android AVD, construir e executar um app do tipo HelloWorld); 3. Para notebooks pessoais, preparar o ambiente de desenvolvimento. Pré-requisitos...

Slide 3

Slide 3 text

1. Saber clonar um repositório Git do GitHub (git clone); 2. Saber trocar de branch’s com Git (git checkout); Skills desejáveis...

Slide 4

Slide 4 text

O que [não] vamos ver... 1. Configurar o ambiente de desenvolvimento;

Slide 5

Slide 5 text

O que [não] vamos ver... 1. Configurar o ambiente de desenvolvimento; 2. Iniciar um projeto do zero;

Slide 6

Slide 6 text

O que [não] vamos ver... 1. Configurar o ambiente de desenvolvimento; 2. Iniciar um projeto do zero; 3. Comandos do Git;

Slide 7

Slide 7 text

O que [não] vamos ver... 1. Configurar o ambiente de desenvolvimento; 2. Iniciar um projeto do zero; 3. Comandos do Git; 4. Customizar estilos;

Slide 8

Slide 8 text

O que [não] vamos ver... 1. Configurar o ambiente de desenvolvimento; 2. Iniciar um projeto do zero; 3. Comandos do Git; 4. Customizar estilos; 5. Boas práticas de programação;

Slide 9

Slide 9 text

O que [não] vamos ver... 1. Configurar o ambiente de desenvolvimento; 2. Iniciar um projeto do zero; 3. Comandos do Git; 4. Customizar estilos; 5. Boas práticas de programação; 6. Ferramentas de build (Gradle ou Maven).

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

O que vamos ver...

Slide 13

Slide 13 text

O que vamos ver... DAO | EventBus

Slide 14

Slide 14 text

O que vamos ver... DAO | EventBus

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

https://github.com/ricardolonga/mercadinho https://github.com/ricardolonga/mercadinho-generator Os projetos estão em:

Slide 17

Slide 17 text

GreenDAO ● Framework open-source;

Slide 18

Slide 18 text

GreenDAO ● Framework open-source; ● Facilita a comunicação com SQLite;

Slide 19

Slide 19 text

GreenDAO ● Framework open-source; ● Facilita a comunicação com SQLite; ● API simples;

Slide 20

Slide 20 text

GreenDAO ● Framework open-source; ● Facilita a comunicação com SQLite; ● API simples; ● Otimizado para Android;

Slide 21

Slide 21 text

GreenDAO ● Framework open-source; ● Facilita a comunicação com SQLite; ● API simples; ● Otimizado para Android; ● Consumo mínimo de memória;

Slide 22

Slide 22 text

GreenDAO ● Framework open-source; ● Facilita a comunicação com SQLite; ● API simples; ● Otimizado para Android; ● Consumo mínimo de memória; ● Biblioteca pequena (menos de 100k);

Slide 23

Slide 23 text

GreenDAO ● Framework open-source; ● Facilita a comunicação com SQLite; ● API simples; ● Otimizado para Android; ● Consumo mínimo de memória; ● Biblioteca pequena (menos de 100k); ● Disponibiliza um gerador de código;

Slide 24

Slide 24 text

GreenDAO ● Framework open-source; ● Facilita a comunicação com SQLite; ● API simples; ● Otimizado para Android; ● Consumo mínimo de memória; ● Biblioteca pequena (menos de 100k); ● Disponibiliza um gerador de código; ● Camera360 (+50.000.000), Pinterest (+10.000.000), ICQ (+10.000.000), etc.

Slide 25

Slide 25 text

public static void main(String[] args) throws Exception { Schema schema = new Schema(1, "br.com.ricardolonga.todo"); Entity item = schema.addEntity("Item"); item.addIdProperty(); item.addStringProperty("title").notNull(); new DaoGenerator().generateAll(schema, "../todo/src-gen"); } DaoGenerator.java Processing schema version 1... Written /home/longa/dev/workspace/todo/src-gen/br/com/ricardolonga/todo/ItemDao.java Written /home/longa/dev/workspace/todo/src-gen/br/com/ricardolonga/todo/Item.java Written /home/longa/dev/workspace/todo/src-gen/br/com/ricardolonga/todo/DaoMaster.java Written /home/longa/dev/workspace/todo/src-gen/br/com/ricardolonga/todo/DaoSession.java Processed 1 entities in 113ms Resultado...

Slide 26

Slide 26 text

DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "todo", null); SQLiteDatabase db = helper.getWritableDatabase(); DaoMaster daoMaster = new DaoMaster(db); DaoSession daoSession = daoMaster.newSession(); ItemDao itemDao = daoSession.getItemDao(); Obtendo o ItemDao... Item item = new Item(null, itemTitle); itemDao.insert(item); itemDao.deleteAll(); itemDao.deleteByKey(id); Exemplos...

Slide 27

Slide 27 text

Hora de exercitar...

Slide 28

Slide 28 text

Crouton ● Framework open-source;

Slide 29

Slide 29 text

Crouton ● Framework open-source; ● Context sensitive;

Slide 30

Slide 30 text

Crouton ● Framework open-source; ● Context sensitive; ● Uma alternativa ao Toast (context insensitive);

Slide 31

Slide 31 text

Toast.makeText(Activity, CharSequence, Duration).show(); Crouton.makeText(Activity, CharSequence, Style).show();

Slide 32

Slide 32 text

Hora de exercitar...

Slide 33

Slide 33 text

EventBus ● Framework open-source;

Slide 34

Slide 34 text

EventBus ● Framework open-source; ● Publish/Subscribe model;

Slide 35

Slide 35 text

EventBus ● Framework open-source; ● Publish/Subscribe model; ● Simplifica a comunicação entre componentes (Activities, Fragments, BroadcastReceivers, Threads, Services);

Slide 36

Slide 36 text

EventBus ● Framework open-source; ● Publish/Subscribe model; ● Simplifica a comunicação entre componentes (Activities, Fragments, BroadcastReceivers, Threads, Services); ● “Menos código, maior qualidade”.

Slide 37

Slide 37 text

EventBus ● Framework open-source; ● Publish/Subscribe model; ● Simplifica a comunicação entre componentes (Activities, Fragments, BroadcastReceivers, Threads, Services); ● “Menos código, maior qualidade”; ● Camera360 (+50.000.000), Path (+10.000.000), Pinterest (+10.000.000), etc.

Slide 38

Slide 38 text

public class XyzActivity extends Activity { public void onCreate() { EventBus.getDefault().register(this); } public void onEvent(ConnectividadeReceiver.ConectividadeAlterada evento) { // Verifico conexão com a internet e notifico usuário... } public void onPause() { EventBus.getDefault().unregister(this); } } public class ConnectividadeReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { EventBus.getDefault().post(new ConectividadeAlterada()); } public static class ConectividadeAlterada { // Pode até enviar informações por aqui. } } BroadcastReceiver Activity

Slide 39

Slide 39 text

Hora de exercitar...

Slide 40

Slide 40 text

AndroidAnnotations ● Framework open-source;

Slide 41

Slide 41 text

AndroidAnnotations ● Framework open-source; ● Simplifica a codificação (reduz boilerplate);

Slide 42

Slide 42 text

AndroidAnnotations ● Framework open-source; ● Simplifica a codificação (reduz boilerplate); ● Facilita a manutenção;

Slide 43

Slide 43 text

AndroidAnnotations ● Framework open-source; ● Simplifica a codificação (reduz boilerplate); ● Facilita a manutenção; ● Permite a injeção de dependências (views, resources, system services, etc);

Slide 44

Slide 44 text

AndroidAnnotations ● Framework open-source; ● Simplifica a codificação (reduz boilerplate); ● Facilita a manutenção; ● Permite a injeção de dependências (views, resources, system services, etc); ● Facilita o trabalho com threads;

Slide 45

Slide 45 text

AndroidAnnotations ● Event binding, sem mais listeners anônimos;

Slide 46

Slide 46 text

AndroidAnnotations ● Event binding, sem mais listeners anônimos; ● Rest client através da criação de interfaces (o framework irá implementar as interfaces);

Slide 47

Slide 47 text

AndroidAnnotations ● Event binding, sem mais listeners anônimos; ● Rest client através da criação de interfaces (o framework irá implementar as interfaces); ● Não impacta na performance em runtime;

Slide 48

Slide 48 text

AndroidAnnotations ● Event binding, sem mais listeners anônimos; ● Rest client através da criação de interfaces (o framework irá implementar as interfaces); ● Não impacta na performance em runtime; ● Tudo isso com menos de 50kb;

Slide 49

Slide 49 text

AndroidAnnotations ● Event binding, sem mais listeners anônimos; ● Rest client através da criação de interfaces (o framework irá implementar as interfaces); ● Não impacta na performance em runtime; ● Tudo isso com menos de 50kb; ● Call of Duty (+1.000.000), Magic Piano by Smule (+10.000.000), etc.

Slide 50

Slide 50 text

ListView bookmarkList = (ListView) findViewById(R.id.bookmarkList);

Slide 51

Slide 51 text

@ViewById ListView bookmarkList; ListView bookmarkList = (ListView) findViewById(R.id.bookmarkList);

Slide 52

Slide 52 text

Button buttonOne = (Button) findViewById(R.id.updateBookmarksButton1); buttonOne.setOnClickListener(new OnClickListener() { public void onClick(View v) { updateBookmarksClicked(); } }); Button buttonTwo = (Button) findViewById(R.id.updateBookmarksButton2); buttonTwo.setOnClickListener(new OnClickListener() { public void onClick(View v) { updateBookmarksClicked(); } });

Slide 53

Slide 53 text

@Click({R.id.updateBookmarksButton1, R.id.updateBookmarksButton2}) void updateBookmarksClicked() { ... } Button buttonOne = (Button) findViewById(R.id.updateBookmarksButton1); buttonOne.setOnClickListener(new OnClickListener() { public void onClick(View v) { updateBookmarksClicked(); } }); Button buttonTwo = (Button) findViewById(R.id.updateBookmarksButton2); buttonTwo.setOnClickListener(new OnClickListener() { public void onClick(View v) { updateBookmarksClicked(); } });

Slide 54

Slide 54 text

void updateBookmarksClicked() { new UpdateBookmarksTask().execute(search.getText().toString(), application.getUserId()); }

Slide 55

Slide 55 text

void updateBookmarksClicked() { new UpdateBookmarksTask().execute(search.getText().toString(), application.getUserId()); } private static final String BOOKMARK_URL = "http://www.bookmarks.com/bookmarks/{userId}?search={search}";

Slide 56

Slide 56 text

void updateBookmarksClicked() { new UpdateBookmarksTask().execute(search.getText().toString(), application.getUserId()); } private static final String BOOKMARK_URL = "http://www.bookmarks.com/bookmarks/{userId}?search={search}"; class UpdateBookmarksTask extends AsyncTask { }

Slide 57

Slide 57 text

void updateBookmarksClicked() { new UpdateBookmarksTask().execute(search.getText().toString(), application.getUserId()); } private static final String BOOKMARK_URL = "http://www.bookmarks.com/bookmarks/{userId}?search={search}"; class UpdateBookmarksTask extends AsyncTask { protected Bookmarks doInBackground(String... params) { // Cria o RestTemplate // Cria o HttpEntity // Invoca o método exchange // Obtém e retorna o Bookmarks } }

Slide 58

Slide 58 text

void updateBookmarksClicked() { new UpdateBookmarksTask().execute(search.getText().toString(), application.getUserId()); } private static final String BOOKMARK_URL = "http://www.bookmarks.com/bookmarks/{userId}?search={search}"; class UpdateBookmarksTask extends AsyncTask { protected Bookmarks doInBackground(String... params) { // Cria o RestTemplate // Cria o HttpEntity // Invoca o método exchange // Obtém e retorna o Bookmarks } protected void onPostExecute(Bookmarks result) { // Atualiza a UI Thread } }

Slide 59

Slide 59 text

void updateBookmarksClicked() { new UpdateBookmarksTask().execute(search.getText().toString(), application.getUserId()); } private static final String BOOKMARK_URL = "http://www.bookmarks.com/bookmarks/{userId}?search={search}"; class UpdateBookmarksTask extends AsyncTask { protected Bookmarks doInBackground(String... params) { // Cria o RestTemplate // Cria o HttpEntity // Invoca o método exchange // Obtém e retorna o Bookmarks } protected void onPostExecute(Bookmarks result) { // Atualiza a UI Thread } } XyzActivity.java

Slide 60

Slide 60 text

void updateBookmarksClicked() { new UpdateBookmarksTask().execute(search.getText().toString(), application.getUserId()); } private static final String BOOKMARK_URL = "http://www.bookmarks.com/bookmarks/{userId}?search={search}"; class UpdateBookmarksTask extends AsyncTask { protected Bookmarks doInBackground(String... params) { // Cria o RestTemplate // Cria o HttpEntity // Invoca o método exchange // Obtém e retorna o Bookmarks } protected void onPostExecute(Bookmarks result) { // Atualiza a UI Thread } } XyzActivity.java Inner class

Slide 61

Slide 61 text

@Rest("http://www.bookmarks.com") public interface BookmarkClient { } BookmarkClient.java

Slide 62

Slide 62 text

@Rest("http://www.bookmarks.com") public interface BookmarkClient { @Get("/bookmarks/{userId}?search={search}") Bookmarks getBookmarks(String search, String userId); } BookmarkClient.java

Slide 63

Slide 63 text

@Rest("http://www.bookmarks.com") public interface BookmarkClient { @Get("/bookmarks/{userId}?search={search}") Bookmarks getBookmarks(String search, String userId); } BookmarkClient.java @RestService BookmarkClient restClient; XyzActivity.java

Slide 64

Slide 64 text

@Rest("http://www.bookmarks.com") public interface BookmarkClient { @Get("/bookmarks/{userId}?search={search}") Bookmarks getBookmarks(String search, String userId); } BookmarkClient.java @RestService BookmarkClient restClient; @Background void searchAsync(String searchString, String userId) { Bookmarks bookmarks = restClient.getBookmarks(searchString, userId); updateBookmarks(bookmarks); } XyzActivity.java

Slide 65

Slide 65 text

@RestService BookmarkClient restClient; @Background void searchAsync(String searchString, String userId) { Bookmarks bookmarks = restClient.getBookmarks(searchString, userId); updateBookmarks(bookmarks); } @UiThread void updateBookmarks(Bookmarks bookmarks) { // Atualiza a UI Thread } XyzActivity.java @Rest("http://www.bookmarks.com") public interface BookmarkClient { @Get("/bookmarks/{userId}?search={search}") Bookmarks getBookmarks(String search, String userId); } BookmarkClient.java

Slide 66

Slide 66 text

Hora de exercitar...

Slide 67

Slide 67 text

No content

Slide 68

Slide 68 text

Referências ● https://github.com/greenrobot/EventBus ● https://github.com/excilys/androidannotations ● http://greendao-orm.com/ ● https://github.com/keyboardsurfer/Crouton

Slide 69

Slide 69 text

Obrigado! @ricardolonga http://about.me/ricardo.longa ricardo.longa@gmail.com