Dica Rápida: Como Usar a Biblioteca EventBus
() translation by (you can also view the original English article)



Construindo um aplicativo Android que tem várias componentes ativos que comunicam uns com os outros pode se tornar tedioso. Para economizar tempo, os desenvolvedores muitas vezes acabam com componentes fortemente acoplados em seus aplicativos. EventBus é uma biblioteca open-source popular que foi criado para resolver esse problema usando o padrão publisher/subscriber.
Usando a biblioteca EventBus, você pode passar mensagens de uma classe para uma ou mais classes em apenas algumas linhas de código. Além disso, todas as classes envolvidas são completamente desacopladas uma da outra, levando a um codigo que é menos complexo e mais fácil de manter e depurar.
Nesta dica rápida, você vai aprender como usar a biblioteca EventBus, através da construção de um aplicativo Android simples, que exibe o status de carregamento do dispositivo. Porque as mudanças no status do carregamento são eventos do sistema, o aplicativo vai ter uma Activity
que precisa receber informações de um BroadcastReceiver
- cenário perfeito para se usar um event bus.
Pré-requisitos
Certifique-se de que você tem o ADT Bundle Eclipse configurado. Você pode baixá-lo a partir do site Android Developer.
1. Criar Novo Projeto
Inicie o Eclipse e crie uma nova aplicação Android. Nomeie a aplicação com EventBusSample
. Escolha um nome de pacote único e defina o Minimum Required SDK para Android 2.2 e o Target SDK para o Android 4.4.



Nós mesmos vamos criar a Activity
, então desmarque Create Activity e clique em Finish.



2. Edite o Manifest
Este aplicativo tem um BroadcastReceiver
que responda às seguintes ações:
android.intent.action.ACTION_POWER_CONNECTED
android.intent.action.ACTION_POWER_DISCONNECTED
Nomeie o BroadcastReceiver
para ChargingReceiver
e declare-o no arquivo AndroidManifest.xml
.
1 |
<receiver android:name=".ChargingReceiver"> |
2 |
<intent-filter>
|
3 |
<action android:name="android.intent.action.ACTION_POWER_CONNECTED" /> |
4 |
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" /> |
5 |
</intent-filter>
|
6 |
</receiver>
|
O app tem uma Activity
para exibir o status de carregamento. Nomeie a DisplayActivity
e declará-lo como mostrado abaixo.
1 |
<activity android:name=".DisplayActivity"> |
2 |
<intent-filter>
|
3 |
<action android:name="android.intent.action.MAIN"/> |
4 |
<category android:name="android.intent.category.LAUNCHER" /> |
5 |
</intent-filter>
|
6 |
</activity>
|
3. Adicione a Biblioteca EventBus
Baixe a versão mais recente da biblioteca EventBus como um JAR de Maven Central e adicione o JAR no diretório libs
do seu projeto.
4. Crie a Classe ChargingEvent
Eventos de event bus são nada além de objetos que contêm a informação que precisa ser comunicado. Vamos atribuir ChargingEvent
ao nome da classe que contém as informações passadas a partir do BroadcastReceiver
à Activity
. Esta é uma classe simples que tem apenas uma String
para representar a informação. Ele também tem um construtor para definir o valor da string e um get para obter seu valor.
Crie um novo arquivo chamado ChargingEvent.java e adicione o seguinte código a ele:
1 |
package com.hathy.eventbussample; |
2 |
|
3 |
public class ChargingEvent { |
4 |
private String data; |
5 |
|
6 |
public ChargingEvent(String data){ |
7 |
this.data = data; |
8 |
}
|
9 |
|
10 |
public String getData(){ |
11 |
return data; |
12 |
}
|
13 |
}
|
5. Crie uma Classe BroadcastReceiver
Criar uma nova classe chamada ChargingReceiver
que estenda de BroadcastReceiver
. Essa classe usa o event bus para publicar mensagens. Ele tem uma variável chamada de bus
, que faz referência ao bus criado pela biblioteca EventBus. O bus é um singleton e você tem que usar o método getDefault
para se referir a ele.
No método onReceive
, nós criamos uma nova instância da classe ChargingEvent
e adicionamos a nossa mensagem a ele. Aqui está uma mensagem de exemplo:
1 |
@14:23:20 this device started charging. |
Para gerar esta mensagem, precisamos fazer o seguinte:
- Use os métodos disponíveis na classe de
Time
para definir a tempo em que o evento ocorreu. - Concatene a string "este dispositivo começou a carregar | descarregar" com base na ação recebida. Se a ação for recebida
Intent.ACTION_POWER_CONNECTED
, o dispositivo está a carregando. Se forIntent.ACTION_POWER_DISCONNECTED
, o dispositivo está a descarregar.
Uma vez que o objeto ChargingEvent
tem a informação correta, é publicado no event bus, utilizando o método post
. A implementação da classe ChargingReceiver
agora deve ter esta aparência:
1 |
package com.hathy.eventbussample; |
2 |
|
3 |
import de.greenrobot.event.EventBus; |
4 |
import android.content.BroadcastReceiver; |
5 |
import android.content.Context; |
6 |
import android.content.Intent; |
7 |
import android.text.format.Time; |
8 |
|
9 |
public class ChargingReceiver extends BroadcastReceiver { |
10 |
|
11 |
private EventBus bus = EventBus.getDefault(); |
12 |
|
13 |
@Override
|
14 |
public void onReceive(Context context, Intent intent) { |
15 |
ChargingEvent event = null; |
16 |
|
17 |
// Get current time
|
18 |
Time now = new Time(); |
19 |
now.setToNow(); |
20 |
String timeOfEvent = now.format("%H:%M:%S"); |
21 |
|
22 |
String eventData = "@" + timeOfEvent + " this device started "; |
23 |
if(intent.getAction().equals(Intent.ACTION_POWER_CONNECTED)){ |
24 |
event=new ChargingEvent(eventData+"charging."); |
25 |
} else if(intent.getAction().equals(Intent.ACTION_POWER_DISCONNECTED)){ |
26 |
event=new ChargingEvent(eventData+"discharging."); |
27 |
}
|
28 |
|
29 |
// Post the event
|
30 |
bus.post(event); |
31 |
}
|
32 |
|
33 |
}
|
Como você pode ver, a publicação de mensagens para o event bus tem apenas uma única linha de código. Além disso, o editor não precisa saber nada sobre o assinante(s).
6. Criar a Classe DisplayActivity
Criar uma nova classe chamada DisplayActivity
. Esta classe é responsável por exibir as mensagens dos eventos publicados no event bus.
Esta classe também tem uma variável que faz referência o event bus. Como a biblioteca EventBus segue o padrão singleton, a exemplo do event bus disponível para essa Activity,
é o mesmo que a instância à disposição do BroadcastReceiver
.
Para permitir que uma classe para se inscrever em eventos bus, o método de register
é invocado. Em nossa Activity
, podemos chamá-lo no método onCreate
.
Da mesma forma, para parar de receber eventos, o método unregister
é invocado. Nós chamamos este método no método onDestroy
para se certificar de todos os recursos são liberados.
A Activity
tem uma layout muito básico, contendo apenas um TextView
que exibe as mensagens. Portanto, não há necessidade de criar um layout para ele. Nós simplesmente usamos TextView
como view do conteúdo de Activity
.
Neste ponto, a implementação da classe DisplayActivity
deve ficar assim:
1 |
package com.hathy.eventbussample; |
2 |
|
3 |
import android.app.Activity; |
4 |
import android.os.Bundle; |
5 |
import android.widget.TextView; |
6 |
import de.greenrobot.event.EventBus; |
7 |
|
8 |
public class DisplayActivity extends Activity { |
9 |
|
10 |
private EventBus bus = EventBus.getDefault(); |
11 |
|
12 |
private TextView view; |
13 |
|
14 |
@Override
|
15 |
protected void onCreate(Bundle savedInstanceState) { |
16 |
super.onCreate(savedInstanceState); |
17 |
|
18 |
view = new TextView(this); |
19 |
|
20 |
view.setTextSize(20f); |
21 |
view.setPadding(20, 20, 20, 20); |
22 |
view.setText("Waiting for events..."); |
23 |
|
24 |
setContentView(view); |
25 |
|
26 |
// Register as a subscriber
|
27 |
bus.register(this); |
28 |
}
|
29 |
|
30 |
@Override
|
31 |
protected void onDestroy() { |
32 |
// Unregister
|
33 |
bus.unregister(this); |
34 |
super.onDestroy(); |
35 |
}
|
36 |
|
37 |
}
|
Cada classe que pretende receber eventos do event bus deve conter um método onEvent
. O nome deste método é importante, porque a biblioteca EventBus usa a API de Reflexão Java para acessar este método. Tem um único parâmetro que se refere ao evento. No nosso caso, o parâmetro vai ser do tipo ChargingEvent
.
Tudo o que fazemos neste método é anexar a última mensagem recebida para o conteúdo do TextView
. A implementação do método onEvent
parece com isso:
1 |
public void onEvent(ChargingEvent event){ |
2 |
view.setText(view.getText() + "\n" + event.getData()); |
3 |
}
|
7. Execute e Teste
O aplicativo agora está pronto para ser testado. Compilar e executá-lo em um dispositivo físico Android. Uma vez que o aplicativo tenha terminado o lançamento, conectar e desconectar o cabo de alimentação de um par de vezes para ver a troca status de carregamento.
Conclusão
Neste tutorial, você aprendeu como usar a biblioteca EventBus, e quanto ela simplifica a comunicação entre classes. A biblioteca é otimizado para a plataforma Android e é muito leve. Isso significa que você pode usá-lo em seus projetos sem ter que se preocupar com o tamanho do seu app. Para saber mais sobre a biblioteca EventBus, visite o projeto no GitHub.
Seja o primeiro a saber sobre novas traduções–siga @tutsplus_pt no Twitter!