RubyConf 2011 – #eufui

quarta-feira, 9 de novembro de 2011
por Beneti


Aconteceu dias 03 e 04/11 no Centro de Convenções Frei Caneca, a edição de 2011 do RubyConf. Foi o primeiro ano que participei e não tive uma boa impressão. Com o tema “A experiência dos outros aumenta a sua. Aproveite”, não rolou legal na minha opinião. O tema é interessante, mas eu senti que tinhas um pessoal muito bom tecnicamente, mas que não tem “preparo” para palestrar… sem contar os “chico estrela”. Algumas palestras foram muito maçantes ao ponto de eu cochilar e brigar para ficar acordado.

A abertura ficou com a palestra “Ruby é fácil?” com o David A. Black. Ele tem mais de 10 anos de experiência com Ruby e foi uma palestra bem interessante. Teve a palestra do inglês Martyn Loughran que é CTO do Pusher, que foi interessante também. E só. De 8 palestras que assisti somente 2 eu gostei. No 2o dia, a primeira palestra era a mais esperada “Quem faz o melhor churrasco?”, com o TenderLove, que dispensa comentários. Só não foi a melhor palestra para mim pois dei a sorte de assistir a palestra do Evan “Rabble” Henshaw, “Lean Startups para o Hacker Ruby”. Essa sim, foi fantástica, pois o assunto startup/empreendedorismo me interessa demais e o cara é muito gente boa. Eu gostei da palestra do Bruno Oliveira também, falando do projeto TorqueBox, que é rodar aplicações Rails/Sinatra ou qualquer uma que use o Rack em cima do JBoss. A vantagem é ter suporte a mensageria ou agendamento de tarefas, por exemplo. E só. Teve a palestra do José Valim, que foi uma introdução de uma aula de compiladores, deu uma dica de um livro e falou do que ele fez no Erlang. Teve a palestra do Nick Sutterer que falaram que foi bacana, mas dei o azar de não assistir. Escolhi mal.

Não gostei de algumas atitudes de alguns palestrantes. Eu encaro da seguinte forma: quando você é um palestrante, você de certa forma é um formador de opinião, então tem que tomar cuidado com o linguajar, evitar palavrões/gírias, evitar “pra mim fazer” e ainda ao dizer “não use tal coisa…”, explicar o porque. Dizer “não use tal coisa porque é um lixo/merda/tosco” não leva a nada.

Sem menosprezar ninguém, pois sei que dá trabalho organizar um evento e ainda elaborar uma palestra, mas eu esperava mais do evento. Não vou comparar eventos também. Ano passado disseram que foi bem interessante, esse ano eu não achei. Mas ano que vem, com certeza estarei presente para ver. Vai que esse ano foi um azar. Uma coisa que me irrita um pouco são os fanboys-xiitas. De um lado escuto “java é um lixo. é verboso. é chato.”, do outro lado “ruby não escala. ruby é de vagabundo.” ou então “iphone dá de 1000 no android. android é um lixo.”… tudo o que eu leio é mimimi.

GDD2011 – #eufui

domingo, 18 de setembro de 2011
por Beneti

Aconteceu dia 16/09 no Sheraton WTC Hotel, a edição de 2011 do Google Developer Day (GDD). Foi o primeiro ano que participei e saí com sensação de “quero ir em todos”. Até fui ver quanto fica pra ir no Google IO, mas muito caro. O evento focou android, html5, cloud, social e tech em geral. O evento estava dividido em quatro salas: verde, vermelha, amarela e azul. Eu basicamente fiquei na sala verde onde o tema foi android. Assisti quatro palestras e depois fui para a sala azul.

A primeira palestra foi com o Bruno Oliveira com o título ‘O que há de novo e importante no Android‘, onde ele mostrou principalmente as novidades da versão Honeycomb e o que podemos esperar com a versão Ice Cream Sandwich. Em seguida foi a palestra do Dan Galpin, ‘Android Market para desenvolvedores‘. Foi a terceira vez que assisti essa palestra, sendo as anteriores no Google IO e no TDC2011. O conteúdo da palestra é sobre os piratas e vampiros, melhores práticas e dicas de como implementar ou não, principalmente no In-App billing, que é a venda de conteúdo dentro da aplicação. Excelente a palestra.

Depois tivemos uma pausa para o almoço. O evento serviu um almoço, bacana. Eu gostei. Lanche, fruta, refrigerante… bem gostoso. Vi gente reclamando, era só ir no shopping, não passa vontade não. Na volta do almoço, outra palesta com o Bruno, agora com o título ‘Excelência na experiência do usuário Android‘. O conteúdo foi parecido com a palestra dele no TDC2011, foi interessante rever. Depois outra palestra com o Dan com o título ‘Gráficos de alto desempenho para Android‘. Confesso que não me prendeu muito, pois falou muito de 2D, 3D, renderscript, NDK e eu não estou indo muito atrás disso.

Após o break, fui pra sala azul e vi a palestra ‘Construa seu negócio com aplicativos móveis’ com o Peter Fernandez. Falou bastante de maneiras de ganhar dinheiro com um aplicativo móvel, falou do AdMob e contou com a presença do Gui Schvartsman da ‘Best, Cool & Fun Games’ (empresa do Ant Smasher), que falou que a principal fonte de renda ainda é a propaganda.

Bom, resumindo, foi um evento bacana. Pretendo ir sempre que possível.

TDC2011 – #eufui

quinta-feira, 15 de setembro de 2011
por Beneti

Esse post vem com um atraso de quase dois meses. De 6 a 10 de julho, aconteceu em São Paulo a edição de 2011 do TDC (The Developers Conference). O evento é organizado pela Globalcode (@globalcode) que tenta montar trilhas que agradem todas as comunidades, seja Java, ruby, C/C++, empreendedorismo, teste, mobile, php e etc. Novamente eu só participei de uma trilha, só consegui ir na quarta-feira e foram palestras bem bacanas. Esse ano o Neto (@netomarin) conseguiu montar duas trilhas, android e mobile. Eu fui na de android, pois é específico e era o que eu queria.

Foram 7 palestras, que eu gostaria de falar em detalhes sobre todas, mas falarei apenas das duas (resumido) que me chamaram mais a atenção: Construindo Aplicativos Android de Alto Desempenho, com o Bruno Oliveira e Melhores Práticas para Interfaces de Usuário, com o Tim Bray, ambos da Google. A primeira, do Bruno, ele falou basicamente do ANR (application not responding), como acontece, o que deve ser feito para evitar, boas práticas, frisou várias vezes para o uso de AsyncTask, para não travar a UI e alertou que o usuário é extremamente impaciente, que é fato. Se sua aplicação começa a dar ANR, o usuário pode começar a dar nota baixa no market, desinstalar e a única coisa que ele não vai fazer é te mandar o erro, vai simplesmente te colocar com 1 estrela e comentar “não funciona” ou “trava”.

Já a palestra do Tim Bray, foi no stadium, que é um auditório. Ele falou sobre as melhores práticas das interfaces, mas focando os tablets. Mostrou alguns exemplos, disse que se você quer fazer uma aplicação bacana, tem que ter um designer, que é o cara que entende. Você pode até tentar fazer algo bacana, mas vai ficar feio. Eu, particularmente, não tenho a manha. Após a palestra, eu fui trocar uma idéia com ele sobre widgets, que ele não tinha comentado. Acabei mostrando minha aplicação (apenas um ‘hour track’) que eu usava um widget para marcar a entrada e saída.

Resumindo, o TDC é um evento bem bacana, tem palestras para todos os gostos. Esse ano, o almoço foi por conta deles também, um lanche do subway e refrigerante. Quem não puder ir, ou achar caro, eles transmitem as palestras do stadium. O TDC acontece em outras cidades também, então fique atento no site: http://www.thedevelopersconference.com.br/

Caso queira instalar o PontoDroid (minha app), segue o link no market. E amanhã tem Google Developer Day, espero fazer um post mais rápido.

[Android] – Admob

sábado, 11 de junho de 2011
por Beneti

Bom, hoje vou dar uma dica para a adicionar propaganda na sua aplicação android. Apesar do AdMob ter a documentação, pode existir alguma falha no entendimento. Primeiro passo, claro é você ser cadastrado no AdMob e ter o seu ID editor da aplicação. É necessário baixar o SDK do AdMob. Coloque o .jar em algum lugar que você esteja acostumado a deixar e adicione no projeto. Caso tenha dúvida de como fazer isso, siga:

  1. Clique com o botão direito em cima do projeto e clique em Properties;
  2. Clique em Java Build Path, do lado esquerdo;
  3. Clique na aba Libraries;
  4. Clique em Add Jars… ou Add External Jars… (dependendo de onde você colocou o arquivo .jar);
  5. Selecione o arquivo (hoje o nome é GoogleAdMobAdsSdk-4.1.0.jar) e dê OK;

Feito isso, vamos ao que interessa. É necessário alterar o manifest, criar um resource, adicionar esse resource no layout, chamar a propaganda e testar.

Alterando o manifest

Insira a seguinte linha:

<activity android:name="com.google.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation"/>

Para o AdMob funcionar, são duas permissões. Adicione:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

Criando o resource

Caso já exista o arquivo attrs.xml dentro do diretório values, apenas acrescente o código abaixo, apartir da tag resource. Caso não exista, crie o arquivo e adicione tudo.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="com.google.ads.AdView">
        <attr name="adSize">
            <enum name="BANNER" value="1" />
            <enum name="IAB_MRECT" value="2" />
            <enum name="IAB_BANNER" value="3" />
            <enum name="IAB_LEADERBOARD" value="4" />
        </attr>
        <attr name="adUnitId" format="string" />
    </declare-styleable>
</resources>

Adicionando o resource no layout

Abra o layout que você deseja colocar a propaganda e insira o código:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent">
  <com.google.ads.AdView android:id="@+id/adView"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         ads:adUnitId="MY_AD_UNIT_ID"
                         ads:adSize="BANNER"
                         ads:loadAdOnCreate="true"/>
</LinearLayout>

Note que a linha ( xmlns:ads=”http://schemas.android.com/apk/lib/com.google.ads” ) é extremamente importante. Se você NÃO colocar, dá erro de parse do XML e se você colocar ERRADO vai dar erro na hora de exibir. É necessário alterar o MY_AD_UNIT_ID, para o ID do editor.

Chamando a propaganda

AdView adView = (AdView)this.findViewById(R.id.adView);
AdRequest adRequest = new AdRequest();
adView.loadAd(adRequest);

Testando no emulador

Para aparecer a propaganda e você conseguir ver, adicione a seguinte linha, antes do adView.load:

adRequest.addTestDevice(AdRequest.TEST_EMULATOR);

Pronto. Espero ter sido de ajuda. Uma outra observação, caso dê o erro Error inflating class com.admob.android.ads.AdView, é por que o recurso não foi definido, no passo do attrs.xml. Até a próxima!

[Android] – AsyncTask

terça-feira, 24 de maio de 2011
por Beneti

Hoje vou dar uma dica sobre o AsyncTask. As vezes temos a necessidade de realizar tarefas em background, seja para baixar um conteúdo ou atualizar informações de um servidor. É comum pensarmos em utilizar threads. É um caminho que requer alguns cuidados. Para evitar o uso e manipulação de threads e facilitar as tarefas executadas em background pode-se utilizar a classe AsyncTask. A implementação é simples.

É necessário extender a classe AsyncTask e implementar o método doInBackground.

private class SomeTask extends AsyncTask{
    private final ProgressDialog dialog = new ProgressDialog(MainActivity.this);
 
    protected void onPreExecute(){
      this.dialog.setMessage("Downloading...");
      this.dialog.show();
    }
 
    @Override
    protected Void doInBackground(String... params) {
      // doSomething
      someMethod();
      return null;
    }
 
    protected void onPostExecute(final Void unused){
      if(this.dialog.isShowing())
        this.dialog.dismiss();
    }
 
  }

Note que, com esse pequeno trecho de código, aparecerá um dialog com a mensagem “Downloading…”, executará o método someMethod() e no final esconderá a dialog. Simples, não? Note também os métodos onPreExecute, ou seja, será chamado antes do doInBackground e o onPostExecute, ou seja, após o doInBackground. E como disparar isso? Basta acrescentar a seguinte linha de código:

new SomeTask().execute();

Espero que a dica tenha sido útil e facilite! :D

Startup Weekend Campinas – #eufui

segunda-feira, 16 de maio de 2011
por Beneti

Bom, no último final de semana (13 a 15 de maio) aconteceu em Campinas o Startup Weekend. É um evento que coloca todo mundo que quer ser empreendedor, quer fazer uma startup, junto para desenvolver uma idéia, no final ter um protótipo e ainda participar da competição. Confesso, que minhas expectativas eram outras. Fui ao evento achando que no final eu estaria apto a desenvolver um “Business Model Canvas” e sabendo um pouco mais sobre a metodolodia “Lean Startup”… mas para a minha surpresa não foi bem assim. Foi MUITO mais que isso.

O evento começou com três painéis, sendo: Investidor, Startup e Grande Empresa. O primeiro painel, contou com a Thais Nagata, profissional da BM&F, que comentou principalmente que uma empresa deve visar entrar na bolsa um dia, mas que deve seguir todo um fluxo sustentável de investimento, passando pelos angels/seeds, depois o venture capital, private equity e por fim o IPO. Foi uma mini-palestra, interessante (tinham pouco tempo para falar). O segundo palestrante foi o Marcio Santos Filho da Inseed Investimentos, que contou sobre o Venture Capital, “como chegar lá”, estimulando as pessoas a participarem dos eventos como Meetup, Startup Weekend, Desafio Brasil e outros. Encerrando o painel, quem falou foi o Francisco Martinez da Integra, que nos deu uma aula (pelo menos foi a sensação que eu tive). Falou dos fatores de sucesso, os fatores de insucesso, way-out e ainda nos passou algumas dicas.

O segundo painel, foi o da grande empresa que contou somente com um palestrante, Benedito Luis Fayan que nos contou as iniciativas da Telefônica em atacar “novos” segmentos através da inovação e com as startups, citando a TecTotal e AtHome.

O terceiro e último painel, foi o da startup, que o Julio Vasconcellos (criado do PeixeUrbano) nos contou rapidamente a história do site. Foi interessante e foi do jeito que eu imaginei, poucos pessoas, mas as pessoas certas, um de marketing, um de TI e um de vendas. O resultado está aí, não precisa nem comentar.

Após isso, teve início aos pitches. Se você não sabe o que é, eu te explico rapidamente. Você tem um minuto para vender a sua idéia. Foram 33 idéias no total. Vejam o meu pitch desastroso (eu nunca tinha feito um) parecendo uma sessão de stand-up comedy. Juro que foi sem querer. É um vídeo longo, o meu está no minuto 41.

Após os pitches, houve uma votação onde cada um poderia escolher 3 pitches que gostou. Eu votei no “ToComFome” que virou “PaladarApp”, votei no “Nossos Peludos” e votei no “Social Book”. A minha idéia foi selecionada, mas só porque tinha vários amigos meus lá, achei injusto e abri mão dela. Acabei trabalhando na idéia dos “Nossos Peludos”. A idéia da Marina, é fazer uma espécie de agregador de ONGs de animais abandonados e possibilitar que qualquer pessoa ajude um determinado cachorro de uma maneira mais fácil. A idéia é aumentar a visibilidade das ONGs e ainda permitir que empresas do ramo de Pet tenham uma exposição maior da sua marca para projetos sociais.

Na equipe estavam eu, o Guilherme Ceolin, Daniel Teixeira, Fabiano Amaro, Pedro Ruggiero, Marina de Camargo (dona da idéia) e o Euripedes Almeida. Eu e a nerdaiada do Ceolin e do Daniel, ficamos responsáveis pelo desenvolvimento do protótipo do “Nossos Peludos”. Como eu não tinha notebook, apenas o Daniel e o Ceolin começaram o desenvolvimento. Eis que o nosso mentor Wilson Campanholi Jr, me perguntou se um netbook com ubuntu me ajudaria… e me emprestou o dele. O cara mandou bem, meio que nos “adotou”. Nos deu várias dicas do Lean, nos incentivou a realizar pesquisa para validar a idéia e nos colocava nos trilhos, como disse o Fabiano. No geral, foi bem interessante trabalhar desse jeito, embora tenha sido cansativo. Mas é interessante ver o que pode ser feito em 2 dias, com uma equipe motivada e focada.

Nosso trabalho não ganhou a competição, mas a recompensa foi maior que isso. Levo comigo uma experiência de um evento fanstástico e ainda um networking, extremamente importante. Foi na minha opinião, o melhor evento que participei até hoje. Com certeza participarei de outros até ter minha startup e fazer uma coisa notável. Depois de ter a minha startup, quero estar do outro lado, ajudando e estimulando as pessoas a perseguirem seus sonhos.

Parabenizar os trutas Augusto Souza, Guilherme Mello e Alê pelo segundo lugar com a aplicação PaladarApp. Os cara mandaram bem, fizeram protótipo em Android e iPhone, show de bola.

Claro, parabenizar toda a equipe de organização que fez um trabalho fanstástico: André Paraense, Igor Santiago, Bedy (“figurinha carimbada” em eventos de Startup/Empreendedorismo e gente boa), Horacio Poblete, Taila Lemos, Marcelo Lima e Ana Carolina Merighe… se faltou alguém, desculpe, é que não estava no site :)

Business Model Canvas

A Vida em Porto Alegre

terça-feira, 3 de maio de 2011
por Beneti

Bom, hoje não farei um post técnico. Apenas relatarei uma pequena jornada. No final do ano passado, eu recebi uma proposta para trabalhar em Porto Alegre e acabei aceitando, era o que eu estava procurando. Foi uma mudança, um tanto quanto radical, pois eu estava saindo do estado de São Paulo, indo para um lugar que eu não conhecia absolutamente ninguém. Eu realmente teria que me virar… era um desafio e uma experiência que eu queria.

Arrumei minhas malas e fui. A empresa iria pagar 30 dias de hotel e eu teria esse tempo para encontrar um apartamento/kitnet para alugar. Confesso, que perguntar para um gaúcho se ele gosta de Porto Alegre, não é uma boa idéia. Ele fará 1001 propagandas da cidade… A primeira impressão que tive, foi a de Porto Alegre ser parecida com Campinas. Claro que estranhei o sotaque, no começo foi até chato, pois para algumas pessoas eu tinha que pedir para repetir o que tinham falado. Estranhei o clima também. Fiquei 6 meses em Porto Alegre, só peguei calor, mas MUITO calor. Lá dizem “Forno Alegre”, os paulistas quase não fazem piada com isso…

Tive muitos problemas para alugar um imóvel lá. Extremamente burocrático, muito mais do que em Campinas. Para começar, eu tinha que apresentar um fiador com dois imóveis (é difícil ter um, imagina dois) ou dois com um imóvel. As outras opções eram: fazer um titulo de capitalização de 18 alugueis ( no caso, seria pouco mais de R$ 14 mil reais) ou um seguro (leia-se, jogar dinheiro fora) de um aluguel e meio. Meio alucinados. Claramente, optei pelo seguro. Mas eles não estão nem aí… As imobiliárias de lá são terríveis.

O gaúcho é extremamente fanático por futebol. Eu trabalhava na rua do Beira-Rio. Em dia de jogo, era uma invasão de pessoas: homem, mulher, senhor, senhora, criança… independente de idade ou sexo, indo para o estádio. O bom de Porto Alegre é que não tem corinthiano, mas os colorados compensam isso. Tudo o Inter é melhor (na cabeça deles)… Incrível. O dia do mundial interclubes foi bem engraçado ver os gremistas secando.

Conheci poucos pontos turísticos… eu estava sozinho lá, não tinha muita vontade de ficar indo. Conheci a famosa ‘Redenção’. É um parque gigante, onde o pessoal vai no final da tarde ou no final de semana para correr e tomar chimarrão. Até agora não entendo como conseguem tomar aquela bebida quente naquele calor. Mas foi o que me disseram, “é coisa de gaúcho. Só sendo gaúcho para entender.”.

A comida lá, se você não quiser sofisticar muito, é bem barato. Eu almoçava (comendo a vontade) com no máximo R$ 11,90. Não é comum ter comida por quilo. Existe, mas se você passa do valor do livre, eles te cobram o livre. Não entendeu? Simples… O kg é R$ 34,00. O livre é R$ 12,00. Se você pegar 500 gr, seriam R$ 17,00, mas não, você paga R$ 12,00 e come a vontade. Isso era bom. Ainda com relação a comida, lá eles chama qualquer lanche de xis. Eles não dizem, vamos  comer lanche, mas sim um xis. Existe um X-Coração, que é feito com coração de galinha… que deixou saudades. Caso você visite Porto Alegre, vá à uma lanchonete na Av Princesa Isabel, com a São Luis, não me recordo o nome e peça um X-Coração. É barato e MUITO bom. Saí muito pouco lá, mas conheci um barzinho chamado “Dublin” e outro “Dona Neusa”. Cada um com seu estilo, mas ambos agradáveis.

Foi uma experiência de vida, bem bacana. Acabei voltando para Campinas em fevereiro por alguns motivos que não vêm ao caso, agora. Conheci pessoas muito bacanas lá, que me ajudaram bastante. Quem ver o meu facebook, eu tirei uma foto na ‘Redenção’ e fiz uma homenagem com todas as pessoas que me ajudaram lá. Se colocar numa balança, foi uma ótima experiência, mas não encaro uma dessas denovo tão cedo.

[RAILS] – REST Actions

sábado, 29 de janeiro de 2011
por Beneti

Faz um tempinho que não posto nada… Hoje vou falar um pouco sobre REST e Rails. As vezes é necessário crias novas actions no rails que é feito com REST. Se você criar um controller qualquer, vamos chamar aqui de empresas e adicionar no arquivo routes.rb (o rails já faz isso) a seguinte linha:

resources :empresas

o rails limita o seu controller em 7 actions, sendo:

- index
- show
- new
- edit
- update
- create
- destroy

na maioria dos casos resolve, mas as vezes é necessário criar novas actions. Vamos supor que você queria adicionar uma action que busque empresas de TI (claro, supondo que exista um indicador para isso). Primeiro defina a action no controller, por exemplo:

def itcompany
  @empresas = Empresa.find(:all, :conditions => ["indicadorti = ?", 'S'])
end

Para funcionar, você tem que “dizer” ao rails que existe essa nova action e qual o tipo de requisição. Para isso no arquivo routes.rb, faça:

resources :empresa do
  collection do
    get :itcompany
  end
end

Com isso, o rails passa a reconhecer o caminho: empresas/itcompany

Agora, para terminar, vamos supor que você queira atualizar esse atributo de indicadorti. Novamente, crie a action, por exemplo:

def setitcompany
  @empresa = Empresa.find(params[:id])
  @empresa.update_attribute :indicadorit, 'S'
end

Agora no routes.rb, é necessário configurar essa nova action:

resources :empresa do
  collection do
    get :itcompany
  end
  member do
    put :setitcompany
  end
end

Com o member, o rails passa a reconhecer o caminho empresa/:id/setitcompany

Entenda a diferença entre o member e o collaction, com isso seus controllers serão sempre magros. É isso e até a próxima.

[Android] – Parse XML

sábado, 16 de outubro de 2010
por Beneti

Aviso aos navegantes: Essa postagem é longa e com muito código. No entanto, tento explicar da melhora maneira possível para você não perder tempo como eu perdi. Divirta-se! Hoje em dia é muito comum termos arquivos XML e podemos ter uma aplicação que para atualizar seus dados, busque-os em arquivos XML. Para realizar o parse utilizei a SAX-Parse, Simple API for XML.

Vamos supor que o arquivo conterá informações sobre a rodada X do Brasileirão (é uma rodada atrasada e só terá 3 jogos). Vamos supor também que as informações desse arquivos são: dia do jogo, horário, local, mandante e visitante. Segue o arquivo utilizado como exemplo:

<?xml version="1.0"?>
<jogos>
  <jogo>
    <dia>20/10/10</dia>
    <horario>21:50</horario>
    <local>Morumbi</local>
    <mandante>São Paulo</mandante>
    <visitante>Palmeiras</visitante>
  </jogo>
  <jogo>
    <dia>20/10/10</dia>
    <horario>21:50</horario>
    <local>Vila Belmiro</local>
    <mandante>Santos</mandante>
    <visitante>Corinthians</visitante>
  </jogo>
  <jogo>
    <dia>21/10/10</dia>
    <horario>19:30</horario>
    <local>Santa Cruz</local>
    <mandante>Botafogo-SP</mandante>
    <visitante>Comercial</visitante>
  </jogo>
</jogos>

Primeiro vamos fazer uma classe para os guardar as informações, Jogo.java.

public class Jogo {
 
    private String dia, horario, local, mandante, visitante;
 
    public void setDia(String pDia) { this.dia = pDia; }
    public void setHorario(String pHorario) { this.horario = pHorario; }
    public void setLocal(String pLocal) { this.local = pLocal; }
    public void setMandante(String pMandante) { this.mandante = pMandante; }
    public void setVisitante(String pVisitante) { this.visitante = pVisitante; }
 
    public String getDia() { return this.dia; }
    public String getHorario() { return this.horario; }
    public String getLocal() { return this.local; }
    public String getMandante() { return this.mandante; }
    public String getVisitante() { return this.visitante; }
 
    public String toString() {
        return "Jogo: " + this.mandante + " x " + this.visitante + "\nLocal: " + this.local + "\nData: " + this.dia + " as " + this.horario;
    }
}

Agora, precisamos criar uma classe que estenda de org.xml.sax.helpers.DefaultHandler. Alguns métodos precisam ser implementados, mas são simples. Neste caso, comentarei no código. Afinal código bom é código comentado :D Eu chamei de JogosHandler.

public class JogosHandler extends DefaultHandler{
 
   //enum para as TAGS do arquivo, eh necessario colocar todos
   //senao vai lancar erro
   private enum TAGS { jogos, jogo, dia, horario, local, mandante, visitante }
 
   //Buffer para armazenar o valor entre a <tag></tag>
   private StringBuffer tempString;
 
   //Necessario para armazenar os 3 jogos
   private Jogo tempJogo;
   private Vector<Jogo> jogos;
 
   //Necessario para saber exatamente qual é a tag que esta sendo lida
   private boolean isJogo, isDia, isHorario, isLocal, isMandante, isVisitante;
 
   public ResumoHandler() {
 
	super();
	this.jogos = new Vector<Jogo>();
	this.tempString = new StringBuffer();
 
    }
 
    public Vector<Jogo> getParsedJogos() { return jogos; }
 
    @Override    
    public void startDocument() { }
 
    @Override
    public void endDocument() { }
 
    //Este metodo eh sempre chamado e no primeiro parametro vem o valor 
    //do que esta entre tag. exemplo <local>Morumbi</local>, o valor de ch eh Morumbi
    @Override
    public void characters(char ch[], int start, int length) {
 
        //so para mostrar que conseguimos saber exatamente com eh a tag que esta sendo lida
        if (isDia || isHorario || isLocal || isMandante || isVisitante){
        	tempString.append(ch,start,length);
        }	
    }
 
    //Este metodo sempre eh chamado na abertura de uma tag, TODAS.
    //seja <jogos><jogo><dia>...
    @Override
    public void startElement(String n, String l, String q, Attributes a) {
 
        //sabemos que a cada tag <jogo> temos um novo jogo. 
        //ja as demais tags, so marcaremos qual eh a tag e limpamos o buffer
	//o segundo parametro l, estara a tag sem <>: jogos, jogo, dia...
        switch(TAGS.valueOf(l)) {
            case jogo: tempJogo = new Jogo(); break;
            case dia: isDia = true; tempString.setLength(0); break;
            case horario: isHorario = true; tempString.setLength(0); break;
            case local: isLocal = true; tempString.setLength(0); break;
            case mandante: isMandante = true; tempString.setLength(0); break;
            case visitante: isVisitante = true; tempString.setLength(0); break;
            default: tempString.setLength(0); break;
        }
 
    }	     
 
    //Este metodo sempre eh chamado no fechamento de uma tag, TODAS.
    //seja </jogos></jogo></dia>...	
    @Override
    public void endElement(String n, String l, String q) {
 
        //sabemos que a cada tag </jogo> ja lemos todas as informacoes, sendo assim, adicionamos no vector. 
        //ja as demais tags, so desmarcaremos qual eh a tag e setamos o atributo com o valor do buffer
	//o segundo parametro l, estara a tag sem </>: jogos, jogo, dia...
        switch(TAGS.valueOf(l)) {
            case dia: isDia = false; tempJogo.setDia(tempString.toString()); break;
            case horario: isHorario = false; tempJogo.setHorario(tempString.toString()); break;
            case local: isLocal = false; tempJogo.setLocal(tempString.toString()); break;
            case mandante: isMandante = false; tempJogo.setMandante(tempString.toString()); break;
            case visitante: isVisitante = false; tempJogo.setVisitante(tempString.toString()); break;
            case jogo: jogos.add(tempJogo); break;
            default: break;
        }
    }
}

Até agora são classes, nada de android. Agora a classe da activity.

public class ParsingXML extends Activity {	
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
    	super.onCreate(icicle);
        //so um lugar para o resultado
        TextView tv = new TextView(this);
        try {
            //endereco do XML
            URL url = new URL("http://some_adress/example.xml");
 
            //SAXParser
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp = spf.newSAXParser();
 
            //XMLReader
            XMLReader xr = sp.getXMLReader();
 
            //Novo Handler, de acordo com o criado, no caso JogosHandler
            JogosHandler andJogosHandler = new JogosHandler();
            xr.setContentHandler(andJogosHandler);
 
            //Realizando o parse de acordo com a URL
            xr.parse(new InputSource(url.openStream()));
 
	    Vector<Jogo> conteudoXML = andJogosHandler.getParsedJogos();
 
            String text = "";
 
	    //loop para percorrer todas as posicoes
            for(int i=0; i < conteudoXML.size(); i++)            
                text += conteudoXML.get(i).toString()+"\n";                
 
            //so exibir na tela
            tv.setContentView(text);
 
        } catch (Exception e) {
            tv.setText("Error: " + e.getMessage());
        }
    }
}

Bom, espero que o Parse XML não seja mais tão doloroso :D

[Android] – Services

sábado, 9 de outubro de 2010
por Beneti

Recentemente, estava desenvolvendo uma app quando o requisito dizia que era necessário criar um serviço. O meu post é baseado neste post do site s s chauhan e neste post do bright hub. Ambos os post e eu também, presumimos que o setup do ambiente e como criar um projeto já esteja feito. Qual a motivação de criar um service? A sua aplicação pode precisar executar um rotina em background e o service resolve isso.

O primeiro passo é adicionar o service no AndroiManifest.xml, lembre-se que qualquer Activity, Service ou Content Provider tem que estar referenciadas no manifest. A edição é simples. Abra o AndroidManifest.xml, vá na aba Application. Em Application Nodes, clique em Add, escolha service e dê OK. Em name, coloque .ServiceName ou .subpackage.ServiceName. Note que ServiceName é o nome da classe, consequentemente o nome do service. Neste exemplo será BenetiService, então eu colocaria .BenetiService. Clique na aba AndroidManifest.xml para ver o conteúdo, deve existir a seguinte linha:

<service android:name=".subpackagename.ServiceName"/>

Neste exemplo, um botão dispara o serviço e o outro cancela. O primeiro abaixo é só para montar a tela com os dois botões e seus listeners.

public class BenetiHello extends Activity
{
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
 
        super.onCreate(savedInstanceState);       
        setContentView(R.layout.main);                     
 
        //criando intent
        final Intent BenetiService = new Intent(this, BenetiService.class);
 
        //botao iniciar
        Button btnStart = (Button) findViewById(R.id.btn_start);
        //listener
        btnStart.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View view)
            {    
                //start the service
                startService(BenetiService);
            }
        });
 
        //botao parar
        Button btnStop = (Button) findViewById(R.id.btn_stop);
        //listener
        btnStop.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view)
            {            
                //stop the service
                stopService(BenetiService); 
            }
        });
    }  
}

Até aqui, sem dúvidas, certo? Agora o código do service

public class BenetiService extends Service
{
 
    private Timer timer=new Timer();
    private static long UPDATE_INTERVAL = 1*60*1000;  //1 minuto
    private static long DELAY_INTERVAL = 0; 
 
    @Override
    public void onCreate()
    {
      super.onCreate();     
      startService();
    }
 
    @Override
     public IBinder onBind(Intent intent) {
	// TODO Auto-generated method stub
	return null;
     }
 
    @Override
    public void onDestroy()
    {
      super.onDestroy();
      stopService();
    }
 
    private void startService()
    {     
      timer.scheduleAtFixedRate(            
              new TimerTask() {
                    public void run() {
                        doServiceWork();
                    }
                  },
                  DELAY_INTERVAL,
                  UPDATE_INTERVAL);
    }
 
    private void doServiceWork()
    {
        //faca algo
       Log.i("doServiceWork","Executando o servico.")
    }
 
    private void stopService()
    {
      timer.cancel();
    }
}

É muito importante sobrescrever o método onDestroy para que a tarefa seja cancelada. Durante o meu desenvolvimento, eu não fiz isso. E cada vez que eu clicava no botão, criava um nova nova tarefa, consequentemente comia a bateria. Detalhe que o valor do UPDATE_INTERVAL é sempre em milisegundos, não esquecer de converter, para isso x (número de minutos desejado) * 60 * 1000. Espero que a dica tenha sido boa e que não percam tempo como eu perdi por causa da falta do timer.cancel().