Android – Injeção de dependência com RoboGuice

 

Neste post eu farei uma breve introdução ao RoboGuice, uma das ferramentas disponíveis no Android para injeção de dependência. Com o simples exemplo apresentado a seguir será possível ter uma noção da grande utilidade e praticidade que o RoboGuice fornece aos projetos mobile. Quem já utiliza Spring ou algo similar no desenvolvimento Java, sabe como este modelo de programação é útil.

 

Bom, chega de papo e vamos ao exemplo:
 

Uma Activity Android normal, que representa uma tela de login, ficaria aproximadamente da seguinte forma. Com as declarações dos widgets e sua criação através do findViewById no método onCreate:
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class MainActivity extends Activity {

    EditText    username;
    EditText    password;
    Button      login;

    /**
     * Called when the activity is first created.
     *
     * @param savedInstanceState
     *            If the activity is being re-initialized after previously being
     *            shut down then this Bundle contains the data it most recently
     *            supplied in onSaveInstanceState(Bundle). <b>Note: Otherwise it
     *            is null.</b>
     */

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        username = (EditText) findViewById(R.id.usr);
        password = (EditText) findViewById(R.id.pwd);
        login = (Button) findViewById(R.id.login);

        // Implementação do método...

    }

 

Com RoboGuice, o código ficaria da seguinte forma:
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class MainActivity extends RoboActivity {

    @InjectView(R.id.username)
    EditText    username;

    @InjectView(R.id.password)
    EditText    password;

    @InjectView(R.id.login)
    Button      login;

    /*
     * (non-Javadoc)
     *
     * @see roboguice.activity.RoboActivity#onCreate(android.os.Bundle)
     */
    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Implementação do método...

    }

}

 

Com um código extremamente mais ‘limpo’ e sem se preocupar com a criação de instancias de Views, Resources, Serviços, etc… Podemos trabalhar com mais facilidade e nos preocupar de fato apenas com a implementação do código e a lógica de negócios necessária na aplicação.

Mas, infelizmente, nem tudo são flores. Não sei se você percebeu, mas no segundo exemplo tivemos que extender nossa classe de RoboActivity, o que deixa nosso código extremamente acoplado e dependente de um framework externo. O RoboGuice provê diversas subclasses de Activity, já que, no Android, temos que utilizar diferentes tipos de Activity para diversos layouts de tela.
Outro ponto fraco do RoboGuice, é que a injeção de dependências é executada em tempo de execução, o que pode trazer um custo a mais à sua aplicação. Entretanto, fica a seu cargo decidir se o RoboGuice é uma boa opção ou não para a sua aplicação. De qualquer forma, vale o conhecimento! :)

Em breve divulgarei mais alguns posts sobre o RoboGuice, aguardem!


Este foi mais um post da série Android, espero que tenham gostado. Quaisquer dúvidas, sugestões e/ou reclamações, comentem!

_________________________________________

Lucas Oliveira – Analista Programador na DClick.
Bacharel em Sistemas de Informação pela Universidade de São Paulo.
@OliveiraLima_

 


4 comentários

  1. Daniel Passos em 2.ago.12 às 10:58 am

    A parte de ser executada no celular e que e algo que ainda me incomoda apesar de achar que o codigo fica MUITO mais limpo fico me questionando o quanto isso vale a pena e em que tipo de projeto isso pode ser realmente vantajoso. Atualmente tenho utilizado bastante o Android Annotation (http://androidannotations.org) que deixa o codigo tão ou mais limpo mas faz todo o processamento na hora da compilação utilizando Java Annotation Processing Tool (http://docs.oracle.com/javase/6/docs/technotes/guides/apt/index.html)

  2. Patricia Lopes em 6.ago.12 às 1:21 pm

    Oi Lucas, legal seus posts sobre Android, estou procurando me especializar no assunto, mas ainda não encontrei um roteiro legal de estudo. Acho que vou ter que fazer um curso mesmo. A D-Click presta esse serviço? Acho que o ideal seria online.
    Você conhece os cursos de Android da Devmedia? O que você acha deles? Pode me ajudar? Obrigada.

    Os links dos cursos que falei são esses:
    http://www.devmedia.com.br/curso/introducao-ao-android-sdk/306
    http://www.devmedia.com.br/curso/curso-de-android-sdk-dominando-a-api/329

    Obrigada mais uma vez e me desculpe se usei o espaço errado para te perguntar isso, mas você me pareceu saber o que escreve e achei que poderia ajudar.

  3. Lucas Oliveira em 8.ago.12 às 4:51 pm

    Olá Daniel!

    Realmente, isto é um ponto bastante crítico do framework e devemos ter bastante cuidado ao utilizá-lo. A recomendação é que seja utilizado em projetos de grande porte, de forma que o custo será inferior ao benefício. Sobre o Android Annotations, este é um framework excepcional e eu pretendo falar dele também em breve :) Inclusive já adianto que os dois (RoboGuice e AA) podem coexistir em um mesmo projeto, apesar das sobreposições.

    Obrigado pelo comentário e pelas dicas!

  4. Lucas Oliveira em 8.ago.12 às 5:05 pm

    Olá Patrícia!

    Obrigado pelo comentário. A DClick não oferece nenhum curso de Android no momento, infelizmente. As opções que eu posso te indicar são:
    O curso da Caelum, que é uma excelente escola: http://www.caelum.com.br/curso/fj-57-desenvolvimento-google-android/
    O próprio site da Google oferece um roteiro de treinamento bastante interessante: http://developer.android.com/training/index.html (O único impeditivo talvez seja o fato de ser em inglês)
    E se você tiver alguma sugestão de post pode pedir ou pelo meu twitter ou aqui mesmo pelos comentários que eu tentarei te ajudar.

Deixe Seu Comentário