Na prática com Android Annotations, 
GreenDAO, EventBus e Crouton.
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.
1. Saber clonar um repositório Git do GitHub (git clone); 
2. Saber trocar de branch’s com Git (git checkout);
1. Configurar o ambiente de desenvolvimento;
1. Configurar o ambiente de desenvolvimento; 
2. Iniciar um projeto do zero;
1. Configurar o ambiente de desenvolvimento; 
2. Iniciar um projeto do zero; 
3. Comandos do Git;
1. Configurar o ambiente de desenvolvimento; 
2. Iniciar um projeto do zero; 
3. Comandos do Git; 
4. Customizar estilos;
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;
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).
DAO | EventBus
DAO | EventBus
https://github.com/ricardolonga/mercadinho 
https://github.com/ricardolonga/mercadinho-generator
GreenDAO 
● Framework open-source;
GreenDAO 
● Framework open-source; 
● Facilita a comunicação com SQLite;
GreenDAO 
● Framework open-source; 
● Facilita a comunicação com SQLite; 
● API simples;
GreenDAO 
● Framework open-source; 
● Facilita a comunicação com SQLite; 
● API simples; 
● Otimizado para Android;
GreenDAO 
● Framework open-source; 
● Facilita a comunicação com SQLite; 
● API simples; 
● Otimizado para Android; 
● Consumo mínimo de memória;
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);
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;
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.
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 
Resultado... 
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
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...
Crouton 
● Framework open-source;
Crouton 
● Framework open-source; 
● Context sensitive;
Crouton 
● Framework open-source; 
● Context sensitive; 
● Uma alternativa ao Toast (context insensitive);
Toast.makeText(Activity, CharSequence, Duration).show(); 
Crouton.makeText(Activity, CharSequence, Style).show();
EventBus 
● Framework open-source;
EventBus 
● Framework open-source; 
● Publish/Subscribe model;
EventBus 
● Framework open-source; 
● Publish/Subscribe model; 
● Simplifica a comunicação entre 
componentes (Activities, Fragments, BroadcastReceivers, 
Threads, Services);
EventBus 
● Framework open-source; 
● Publish/Subscribe model; 
● Simplifica a comunicação entre 
componentes (Activities, Fragments, BroadcastReceivers, 
Threads, Services); 
● “Menos código, maior qualidade”.
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.
Activity 
BroadcastReceiver
AndroidAnnotations 
● Framework open-source;
AndroidAnnotations 
● Framework open-source; 
● Simplifica a codificação (reduz boilerplate);
AndroidAnnotations 
● Framework open-source; 
● Simplifica a codificação (reduz boilerplate); 
● Facilita a manutenção;
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);
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;
AndroidAnnotations 
● Event binding, sem mais listeners anônimos;
AndroidAnnotations 
● Event binding, sem mais listeners anônimos; 
● Rest client através da criação de interfaces 
(o framework irá implementar as interfaces);
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;
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;
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.
ListView bookmarkList = (ListView) findViewById(R.id.bookmarkList);
ListView bookmarkList = (ListView) findViewById(R.id.bookmarkList); 
@ViewById 
ListView bookmarkList;
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(); 
} 
});
Button buttonOne = (Button) findViewById(R.id.updateBookmarksButton1); 
buttonOne.setOnClickListener(new OnClickListener() { 
@Click({R.id.updateBookmarksButton1, R.id.updateBookmarksButton2}) 
void updateBookmarksClicked() { 
... 
} 
public void onClick(View v) { 
updateBookmarksClicked(); 
} 
}); 
Button buttonTwo = (Button) findViewById(R.id.updateBookmarksButton2); 
buttonTwo.setOnClickListener(new OnClickListener() { 
public void onClick(View v) { 
updateBookmarksClicked(); 
} 
});
void updateBookmarksClicked() { 
new UpdateBookmarksTask().execute(search.getText().toString(), application.getUserId()); 
}
void updateBookmarksClicked() { 
new UpdateBookmarksTask().execute(search.getText().toString(), application.getUserId()); 
} 
private static final String BOOKMARK_URL = "http://www.bookmarks.com/bookmarks/{userId}?search={search}";
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<String, Void, Bookmarks> { 
}
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<String, Void, Bookmarks> { 
protected Bookmarks doInBackground(String... params) { 
// Cria o RestTemplate 
// Cria o HttpEntity 
// Invoca o método exchange 
// Obtém e retorna o Bookmarks 
} 
}
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<String, Void, Bookmarks> { 
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 
} 
}
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<String, Void, Bookmarks> { 
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
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<String, Void, Bookmarks> { 
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 
} 
} 
Inner class 
XyzActivity.java
@Rest("http://www.bookmarks.com") 
public interface BookmarkClient { 
} 
BookmarkClient.java
@Rest("http://www.bookmarks.com") 
public interface BookmarkClient { 
@Get("/bookmarks/{userId}?search={search}") 
Bookmarks getBookmarks(String search, String userId); 
} BookmarkClient.java
@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
@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
@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
Referências 
● https://github.com/greenrobot/EventBus 
● https://github.com/excilys/androidannotations 
● http://greendao-orm.com/ 
● https://github.com/keyboardsurfer/Crouton
@ricardolonga 
http://about.me/ricardo.longa 
ricardo.longa@gmail.com 
Obrigado!

Minicurso sobre AndroidAnnotations, GreenDAO, EventBus e Crouton

  • 1.
    Na prática comAndroid Annotations, GreenDAO, EventBus e Crouton.
  • 2.
    1. Conhecimento intermediárioem 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.
  • 3.
    1. Saber clonarum repositório Git do GitHub (git clone); 2. Saber trocar de branch’s com Git (git checkout);
  • 4.
    1. Configurar oambiente de desenvolvimento;
  • 5.
    1. Configurar oambiente de desenvolvimento; 2. Iniciar um projeto do zero;
  • 6.
    1. Configurar oambiente de desenvolvimento; 2. Iniciar um projeto do zero; 3. Comandos do Git;
  • 7.
    1. Configurar oambiente de desenvolvimento; 2. Iniciar um projeto do zero; 3. Comandos do Git; 4. Customizar estilos;
  • 8.
    1. Configurar oambiente de desenvolvimento; 2. Iniciar um projeto do zero; 3. Comandos do Git; 4. Customizar estilos; 5. Boas práticas de programação;
  • 9.
    1. Configurar oambiente 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).
  • 13.
  • 14.
  • 16.
  • 17.
  • 18.
    GreenDAO ● Frameworkopen-source; ● Facilita a comunicação com SQLite;
  • 19.
    GreenDAO ● Frameworkopen-source; ● Facilita a comunicação com SQLite; ● API simples;
  • 20.
    GreenDAO ● Frameworkopen-source; ● Facilita a comunicação com SQLite; ● API simples; ● Otimizado para Android;
  • 21.
    GreenDAO ● Frameworkopen-source; ● Facilita a comunicação com SQLite; ● API simples; ● Otimizado para Android; ● Consumo mínimo de memória;
  • 22.
    GreenDAO ● Frameworkopen-source; ● Facilita a comunicação com SQLite; ● API simples; ● Otimizado para Android; ● Consumo mínimo de memória; ● Biblioteca pequena (menos de 100k);
  • 23.
    GreenDAO ● Frameworkopen-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;
  • 24.
    GreenDAO ● Frameworkopen-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.
  • 25.
    public static voidmain(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 Resultado... 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
  • 26.
    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...
  • 28.
  • 29.
    Crouton ● Frameworkopen-source; ● Context sensitive;
  • 30.
    Crouton ● Frameworkopen-source; ● Context sensitive; ● Uma alternativa ao Toast (context insensitive);
  • 31.
    Toast.makeText(Activity, CharSequence, Duration).show(); Crouton.makeText(Activity, CharSequence, Style).show();
  • 33.
  • 34.
    EventBus ● Frameworkopen-source; ● Publish/Subscribe model;
  • 35.
    EventBus ● Frameworkopen-source; ● Publish/Subscribe model; ● Simplifica a comunicação entre componentes (Activities, Fragments, BroadcastReceivers, Threads, Services);
  • 36.
    EventBus ● Frameworkopen-source; ● Publish/Subscribe model; ● Simplifica a comunicação entre componentes (Activities, Fragments, BroadcastReceivers, Threads, Services); ● “Menos código, maior qualidade”.
  • 37.
    EventBus ● Frameworkopen-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.
  • 38.
  • 40.
  • 41.
    AndroidAnnotations ● Frameworkopen-source; ● Simplifica a codificação (reduz boilerplate);
  • 42.
    AndroidAnnotations ● Frameworkopen-source; ● Simplifica a codificação (reduz boilerplate); ● Facilita a manutenção;
  • 43.
    AndroidAnnotations ● Frameworkopen-source; ● Simplifica a codificação (reduz boilerplate); ● Facilita a manutenção; ● Permite a injeção de dependências (views, resources, system services, etc);
  • 44.
    AndroidAnnotations ● Frameworkopen-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;
  • 45.
    AndroidAnnotations ● Eventbinding, sem mais listeners anônimos;
  • 46.
    AndroidAnnotations ● Eventbinding, sem mais listeners anônimos; ● Rest client através da criação de interfaces (o framework irá implementar as interfaces);
  • 47.
    AndroidAnnotations ● Eventbinding, 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;
  • 48.
    AndroidAnnotations ● Eventbinding, 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;
  • 49.
    AndroidAnnotations ● Eventbinding, 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.
  • 50.
    ListView bookmarkList =(ListView) findViewById(R.id.bookmarkList);
  • 51.
    ListView bookmarkList =(ListView) findViewById(R.id.bookmarkList); @ViewById ListView bookmarkList;
  • 52.
    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(); } });
  • 53.
    Button buttonOne =(Button) findViewById(R.id.updateBookmarksButton1); buttonOne.setOnClickListener(new OnClickListener() { @Click({R.id.updateBookmarksButton1, R.id.updateBookmarksButton2}) void updateBookmarksClicked() { ... } public void onClick(View v) { updateBookmarksClicked(); } }); Button buttonTwo = (Button) findViewById(R.id.updateBookmarksButton2); buttonTwo.setOnClickListener(new OnClickListener() { public void onClick(View v) { updateBookmarksClicked(); } });
  • 54.
    void updateBookmarksClicked() { new UpdateBookmarksTask().execute(search.getText().toString(), application.getUserId()); }
  • 55.
    void updateBookmarksClicked() { new UpdateBookmarksTask().execute(search.getText().toString(), application.getUserId()); } private static final String BOOKMARK_URL = "http://www.bookmarks.com/bookmarks/{userId}?search={search}";
  • 56.
    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<String, Void, Bookmarks> { }
  • 57.
    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<String, Void, Bookmarks> { protected Bookmarks doInBackground(String... params) { // Cria o RestTemplate // Cria o HttpEntity // Invoca o método exchange // Obtém e retorna o Bookmarks } }
  • 58.
    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<String, Void, Bookmarks> { 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 } }
  • 59.
    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<String, Void, Bookmarks> { 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
  • 60.
    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<String, Void, Bookmarks> { 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 } } Inner class XyzActivity.java
  • 61.
    @Rest("http://www.bookmarks.com") public interfaceBookmarkClient { } BookmarkClient.java
  • 62.
    @Rest("http://www.bookmarks.com") public interfaceBookmarkClient { @Get("/bookmarks/{userId}?search={search}") Bookmarks getBookmarks(String search, String userId); } BookmarkClient.java
  • 63.
    @Rest("http://www.bookmarks.com") public interfaceBookmarkClient { @Get("/bookmarks/{userId}?search={search}") Bookmarks getBookmarks(String search, String userId); } BookmarkClient.java @RestService BookmarkClient restClient; XyzActivity.java
  • 64.
    @Rest("http://www.bookmarks.com") public interfaceBookmarkClient { @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
  • 65.
    @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
  • 68.
    Referências ● https://github.com/greenrobot/EventBus ● https://github.com/excilys/androidannotations ● http://greendao-orm.com/ ● https://github.com/keyboardsurfer/Crouton
  • 69.