terça-feira, 11 de dezembro de 2012

Content Provider, usando

 Para usar o Content Provider MyLocationProvider definido no último post, vamos tomar como base a mesma aplicação que testamos em diversos posts anteriores.

 O app tem as seguintes características:

 1. A activity inicia lendo os dados existentes no Content Provider e os mostra numa ListView. Para isso usamos um ManagedQuery, como o cursor resultante da leitura será gerenciado, o ListView será atualizado automaticamente quando o Content Provider for alterado.
 Usamos um ListAdapter extendido de um CursorAdapter para tratar os dados do cursor.
 A leitura dos dados é feita com um Limit de 20 linhas para ficar mais rápido e exemplificar o uso da clausula no db. A ordem é decrescente de data. O último location gravado é o primeiro do ListView.
 No método onStart é iniciado o service para coleta dos dados dos Locations Providers.
 Temos tres botões:
 .Start - inicia a coleta de dados no service
 .Stop - para a coleta de dados no service
 .Clear DB - Deleta todos os registros existentes no Content Provider

 2. No service:
 .Uso da tecnica produtor/consumidor para gravar os dados através de uma worker thread.
 .Uso de uma BlockingQueue para passar os Locations da thread principal para o thread consumidora
 .A worker thread é iniciada no onBind e fica aguardando os Locations para gravar no Content Provider
 .Uso da tecnica de controle do encerramento de uma thread através do envio de um objeto indicativo de fim

 Vamos aos códigos:

 AndroidManifest.xml

main.xml


linhalista.xml


ListAdapter.java

MyLocationActivity.java

MyLocationService.java

Algumas observações finais:
 .Normalmente não gravamos todos os Locations recebidos, fazemos uma seleção dos mais precisos, por tempo, etc.
 .Ou, definimos critérios para os providers nos enviar somente os locations em conformidade com os mesmos.
 .O metodo ManagedQuery está deprecated a partir do API 11, Android 3.0.x
 .Foi substituído pelo CursorLoader
 .O acesso aos dados para o ListView está na UI Thread, se ficar muito demorado usar uma AsyncTask.
 .Não testei o método update

Vejam o resultado, no Xperia mini:





 Abraços







Nenhum comentário:

Postar um comentário