O documento fornece instruções sobre como desenvolver um leitor de feeds RSS para Android usando uma arquitetura MVC. Resume as principais classes do aplicativo: Modelo (Feed, Artigo), Visão (Listas de Feeds e Artigos), Controle (NewsDB para banco de dados, RSSHandler para parsing). Explica também como recuperar dados do feed e armazená-los no banco para exibição na interface do usuário.
3. URLConnection
java.net.URL url = new java.net.URL(“http://developer.android.com");
java.net.URLConnection uc = url.openConnection();
BufferedReader br = new BufferedReader( new InputStreamReader (
uc.getInputStream() ) );
Faça uma aplicação
que exiba o código-
fonte de uma página
qualquer cujo
endereço é digitado
em um EditText.
OBS: Lembre-se de
definir permissão de
acesso à Internet no
AndroidManifest.xml
4. URLConnection
Faça uma aplicação que acesse exemploget.php e mostre o
retorno em um TextView.
Exemplo:
http://erisvaldojunior.com/exemploget.php?tipo=2
tipo=1 Retorno: Bom dia
tipo=2 Retorno: Boa tarde
tipo=3 Retorno: Boa noite
Default Retorno: Oi
5. ListView
Provê uma lista de itens (com scrolling) provenientes de um
Array/Lista ou de um banco de dados.
ListView é abastecido através de um adaptador. Pode-se fazer seu
próprio adaptador para determinar como os dados são lidos.
ArrayAdapter e CursorAdapter
• ArrayAdapter – trata dados baseados em Array ou
Lists;
• SimpleCursorAdapter – trata dados provenientes de
um banco de dados SQLite.
6. ListActivity
Classe base para uma Activity cujo objetivo é mostrar uma lista.
Provê facilidades como um método predefinido para quando um
usuário seleciona um elemento da lista.
Contém um adaptador que deve ser setado no próprio metodo
onCreate() da ListActivity. Isso é feito através do setListAdapter().
onListItemClick() – método de ListActivity chamado quando
um item da lista é selecionado.
• Layouts Default – os itens da lista podem ter um layout
padrão. Ex: android.R.layout.simple_list_item1;
• Layouts Personalizados – seu layout (XML) deve conter uma
ListView com o ID @android:id/list. Além disso, você pode
ter um TextView @android:id/empty indicando lista vazia.
7. Exemplo 1
Criar uma lista de elementos com ListActivity + Array Adapter +
Layout Default.
8. Exemplo 2
Criar uma lista de elementos com ListActivity + Array Adapter +
Layout PERSONALIZADO.
• Modificar o código anterior para
o ArrayAdapter utilizar o layout
abaixo, apontando para o
R.id.label.
rowlayout.xml
9. ListActivity com layout dinâmico
Nos exemplos anteriores, o layout é o mesmo para todos os itens.
É possível mudar a aparência de itens específicos de uma ListView
criando o seu próprio adaptador, através do método getView() e
da classe LayoutInflater.
MySimpleArrayAdapter extends ArrayAdapter
• getView(int position, View convertView,
ViewGroup parent) – método que deve ser
sobrecarregado para personalizar a aparência do
item da lista.
12. ListView, ListActivity e Adapters
Há muitas outras possibilidades!
• setOnItemLongClickViewListener() de ListView – apresenta
o método onItemLongClick(), invocado quando o usuário
mantém o dedo pressionado sobre um item;
• Seleção Múltipla;
• Cabeçalho e rodapé;
• SimpleCursorAdapter
• ContentProvider – exemplo: mostrar lista de contatos;
• Banco de dados próprio (SQLite).
15. NewsDroid – Leitor de RSS Android Permissions
O Parser XML do Twitter precisa acessar a Internet.
16. TwitterHandler
NewsDroid - Controladores Classe responsável por ler um arquivo XML e realizar o parsing
do mesmo, obtendo o seu conteúdo. Para isso, faz-se uso da
API SAX (Simple API for XML), nativa do Android SDK.
http://twitter.com/status/user_timeline/yupistudiosBR.xml ( @yupistudiosBR )
17. TwitterHandler (Tweet)
NewsDroid - Controladores No arquivo XML, cada tweet deve ser lido através dos métodos
startElement() , characters() e endElement() de
DefaultHandler.
No arquivo XML, cada tweet está
representado por uma tag <status>,
possuindo um texto (<text>), uma
data (<created_at>), contagem de
retweets (<retweet_count>), entre
outras informações.
18. TwitterHandler (Parsing)
NewsDroid - Controladores A API SAX é bastante simples de ser utilizada. Basicamente, ao
analisar o trecho <text>Texto do Tweet</text>, o Handler
trabalha com a chamada de três métodos:
• startElement() – Essa função é chamada quando o parser
encontra um elemento. No exemplo acima, startElement() é
invocado com a passagem de “text” como parâmetro;
• characters() – Chamada logo após o startElement() e antes
de se encontrar o final do elemento. No exemplo acima,
characters() é invocado com a passagem de “Texto do
Tweet” como parâmetro;
• endElement() – Chamada quando o parser encontra o final
do elemento. No exemplo acima, endElement() é invocado
após characters() com a passagem de “text” como
parâmetro.
19. TwitterHandler – SAXParser
A partir de um SAXParserFactory, cria-se um XMLParser e, a partir
deste, um XMLReader. Por fim, define-se o ContentHandler e então
NewsDroid - Controladores
inicia-se o parsing.
Em código:
20. TwitterHandler – Técnica para leitura do XML
Cria-se um StringBuffer no startElement(). No characters(), adiciona-se os
NewsDroid - Controladores
caracteres ao StringBuffer criado. Por fim, no endElement(), verifica-se a
tag que foi lida e a informação é repassada para a variável desejada.
Dessa forma, quando o endElement() é chamado,
descobre-se em que tag o parser se encontra e,
então, basta passar o conteúdo do StringBuffer
para a variável desejada.
No endElement(), uma vez que o tweet atual já foi
lido, pode-se armazenar os dados em um banco de
dados, se desejar.
21. O que tudo isso possibilita?
Criar um “cliente” de Twitter (apenas leitura)!
• Campo de texto para adicionar o nome do usuário –
@yupistudiosBR , @yupistudios , @erisvaldojunior , etc;
• ListView para exibir os tweets daquele usuário;
• O ListView pode ser personalizado com imagens;
• Podem ser mostrados: data/hora do Tweet, quantidade de
retweets e informações extras.
24. NewsDroid – Leitor de RSS Estrutura do aplicativo (MVC)
O aplicativo Leitor de Feeds consiste de seis classes:
Classes de modelo:
• Evento – entidade que armazena os dados de um evento: id,
titulo, descrição e url;
Classes de visão:
• SplashActivity – Splash Screen;
• EventosListActivity – Tela com a lista de eventos;
• EventosListAdapter– Adaptador com as informações que
preenchem a lista.
Classes de controle:
• EventosReader – efetua a leitura do feed, usando o Handler
para fazer o parsing e, em seguida, preenche a lista;
• EventosHandler – faz o parsing do Feed (XML) para obtenção
de cada evento.
25. NewsDroid – Leitor de RSS ListActivity
A lista de Feeds ou Artigos pode ser facilmente exibida por
meio de uma especialização de Activity, o ListActivity.
Trata-se de um Activity que mostra uma lista de itens
associados a uma fonte de dados, como um array ou um
Cursor. Além disso, disponibiliza tratadores de eventos para
quando o usuário seleciona um item.
O conteúdo do ListActivity é associado através do método
setListAdapter() que recebe como parâmetro uma classe
que implementa a interface ListAdapter. Pode ser um
ArrayAdapter, um SimpleAdapter (Map) ou um
SimpleCursorAdapter (Cursor).
26. ListActivity
public class EventosActivity extends ListActivity
Layout de uma ListActivity deve conter um <ListView>
28. EventosHandler
NewsDroid - Controladores Classe responsável por ler um RSS (arquivo XML) e realizar o
parsing do mesmo, obtendo o seu conteúdo. Para isso, faz-se
uso da API SAX (Simple API for XML), nativa do Android SDK.
29. EventosHandler (Evento)
NewsDroid - Controladores No arquivo XML, cada artigo deve ser lido através dos métodos
startElement() , characters() e endElement() de DefaultHandler.
No arquivo XML, cada evento está representado
por uma tag <item>, possuindo um título (<title>),
uma URL (<link>), uma descrição (equivalente ao
conteúdo do artigo e representada pela tag
<description>), URL de comentários
(<comments>), data de publicação (<pubDate>) e
o criador (<dc:creator).
30. EventosHandler (Parsing)
NewsDroid - Controladores A API SAX é bastante simples de ser utilizada. Basicamente, ao
analisar o trecho <exemplo>teste</exemplo>, o Handler
trabalha com a chamada de três métodos:
• startElement() – Essa função é chamada quando o parser
encontra um elemento. No exemplo acima, startElement() é
invocado com a passagem de “exemplo” como parâmetro;
• characters() – Chamada logo após o startElement() e antes
de se encontrar o final do elemento. No exemplo acima,
characters() é invocado com a passagem de “teste” como
parâmetro;
• endElement() – Chamada quando o parser encontra o final
do elemento. No exemplo acima, endElement() é invocado
após characters() com a passagem de “exemplo” como
parâmetro
31. EventosHandler – SAXParser
A partir de um SAXParserFactory, cria-se um XMLParser e, a
partir deste, um XMLReader. Por fim, define-se o
NewsDroid - Controladores
ContentHandler e então inicia-se o parsing.
Em código:
32. EventosHandler – Técnica para leitura do XML
Cria-se um StringBuffer no startElement(). No characters(),
adiciona-se os caracteres ao StringBuffer criado. Por fim, no
NewsDroid - Controladores
endElement(), verifica-se a tag que foi lida e a informação é
repassada para a variável desejada.
Dessa forma, quando o endElement() é chamado,
descobre-se em que tag o parser se encontra e,
então, basta passar o conteúdo do StringBuffer
para a variável desejada.
No endElement(), uma vez que o feed atual ou
artigo atual já foi lido, pode-se armazenar os dados
em um banco de dados, se desejar.
35. Interface do Usuário
A interface da aplicação é composta por três telas: lista de
Feeds, lista de Artigos e a tela para adição de um novo Feed.
NewsDroid - Visão
36. Interface do Usuário – Seleção de um Feed
Quando um feed é selecionado, cria-se um Intent que chama a
Activity de listagem dos artigos desse feed. Para isso, é
necessário embutir os dados do feed como parâmetros da
Activity, conforme mostrado abaixo.
NewsDroid - Visão
37. Feed e Artigo
Entidades correspondentes às tabelas do SQLite. Um Feed
possui um ID, título e uma URL. Um Artigo, por sua vez, possui
um ID, o ID do feed a qual pertence, título e URL.
NewsDroid - Modelo
38. NewsDB
NewsDroid - Controladores Classe responsável pela criação do banco de dados, inserção e
remoção de registros.
Para o banco de dados do NewsDroid, são necessárias duas
tabelas: feeds e artigos. A primeira deve conter um id, o
título do feed e a URL do arquivo XML do feed. A segunda,
por sua vez, contém um id, o título do artigo e a URL do
artigo.
Assim, o código SQL para criação dessas tabelas é o seguinte:
create table feeds
(feed_id integer primary key autoincrement,
title text not null,
url text not null);
create table articles
(article_id integer primary key autoincrement,
feed_id int not null, title text not null, url text not null);
39. NewsDB
NewsDroid - Controladores Agora que se conhece a composição do banco de dados da
aplicação, pode-se determinar quais as responsabilidades da
classe NewsDB que irá abstrair o banco.
• Criar banco de dados e tabelas – A classe NewsDB deve
criar o banco de dados e as tabelas necessárias para o
armazenamento dos feeds e artigos;
• Inserir dados – Prover métodos para a inserção de um novo
feed ou artigo no banco de dados;
• Excluir dados – Prover métodos para a remoção de um feed
ou artigo do banco de dados;
• Obter dados – Prover métodos para a obtenção de um feed
e seus respectivos artigos do banco de dados.
40. Interface do Usuário – Seleção de um Feed
Uma vez selecionado o feed, o Activity de artigos é criado,
recebendo os dados do feed pelo Intent. Isso é feito dentro do
método onCreate() do ArtigosActivity.
NewsDroid - Visão
41. Interface do Usuário – Seleção de um Feed
Para garantir que, quando o ArtigosActivity seja pausado ou
destruído, ele não perca o seu estado, deve-se implementar o
método onFreeze(), no qual se armazenam as informações
desejadas.
NewsDroid - Visão
42. Interface do Usuário – Seleção de um Artigo
Quando um artigo é selecionado, cria-se um Intent que é
responsável por invocar o browser do Android, passando como
parâmetro a URL do artigo escolhido.
NewsDroid - Visão
43. Interface do Usuário – Adição de um Feed
Simples Activity na qual o usuário digita a URL do Feed e o
mesmo é adicionado no banco de dados.
NewsDroid - Visão
44. NewsDroid – Leitor de RSS Estrutura do aplicativo (MVC)
O aplicativo NewsDroid consiste, basicamente, de sete classes:
Classes de modelo:
• Artigo – armazena os dados de um artigo, como o
título e o endereço;
• Feed – armazena os dados de um feed, como o título e
o endereço do arquivo XML.
Classes de visão:
• ArtigosList – ListActivity que mostra os artigos;
• FeedsList – ListActivity que mostra os feeds;
• URLEditor – Activity para que o usuário digite a URL do
feed desejado.
Classes de controle:
• NewsDB – abstrai o uso de SQLite para persistência;
• RSSHandler – realiza o parsing de feeds RSS e captura
apenas o necessário dos mesmos.