segunda-feira, 30 de março de 2015

Explorando libs famosas: Otto

Olá povo,

Acho que todos que me conhecem sabem que eu não sou muito fã de usar libs de terceiros. Principalmente porque na grande maioria das vezes, é mais fácil você entender apenas o código que é puramente Android, do que ter que lembrar ou saber como uma lib realiza determinado comportamento.
Mas como muita gente gosta, resolvi fazer uma série de posts com algumas bibliotecas Android mais famosas no mercado. E pra começar, vamos falar do Otto.

Otto (http://square.github.io/otto/)
Permite registrar e disparar eventos de/para qualquer parte da aplicação. Adicione a dependência a seguir.
dependencies {
  compile 'com.squareup:otto:1.3.6'
}
A primeira coisa a fazer é instanciar um objeto da classe Bus. Um bom local para fazer isso é na classe que herda de Application (lugar perfeito iniciar os singletons).
import android.app.Application;
import com.squareup.otto.Bus;

public class ExplorandoLibsApp extends Application {

  private Bus bus;

  @Override
  public void onCreate() {
    super.onCreate();
    bus = new Bus();
  }

  public Bus getBus() {
    return bus;
  }
}
Não esqueça de declarar essa classe no AndroidManifest.xml.
 
<application
  ...
  android:name=".ExplorandoLibsApp">
Qualquer classe pode ser enviada como evento...
public class UmaClasseQualquer {

  private String mTexto;

  UmaClasseQualquer(String texto) {
    mTexto = texto;
  }

  public String getTexto() {
    return mTexto;
  }
}
E todo método que assinar um evento será notificado. Para assinar um evento, use a anotação @Subscribe. E para disparar o evento utilize o método post(evento) do objeto Bus.
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Toast;
import com.squareup.otto.Bus;
import com.squareup.otto.Subscribe;

public class MainActivity extends ActionBarActivity {

    private Bus mBus;

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

      mBus = ((ExplorandoLibsApp)getApplication())
             .getBus();
      mBus.register(this);
    }

    public void dispararEventoOtto(View v){
      mBus.post(new UmaClasseQualquer("Mensagem"));
    }

    @Subscribe
    public void chegouEvento(UmaClasseQualquer event) {
      Toast.makeText(this, event.getTexto(), 
        Toast.LENGTH_SHORT).show();
    }
}
Obtemos a instância do Bus no onCreate() e informamos que essa classe ouvirá eventos do Bus por meio do método register. O método dispararEventoOtto() é invocado ao clicar em um botão, e nele disparamos o evento chamando o método post(). Quando isso ocorre o método chegouEvento() é invocado.

Outra biblioteca que realiza o mesmo trabalho é o EventBus.

Podemos realizar comportamento similar utilizando as classes BroadcastReceiver e LocalBroadcastManager.

4br4ç05,
nglauber

Nenhum comentário: