Otto是一个在Android中的事件总线框架,它是square的一个开源框架
Otto事件总线
Otto中真正用到的就只有一个类两个注解三个方法:
Bus
- 管理注册、注销和发布事件@Produce
- 标记该方法是生产者,产生的事件内容为该方法的返回值@Subscribe
- 标记该方法是订阅者,表示订阅了一个事件,方法需要修饰符为public,而区分不同的订阅者是通过方法的参数来区分的,且订阅了某事件的所有订阅者都可以收到该事件register(Object obj)
- 注册,订阅事件前都需要注册unregister(Object obj)
- 注销,放弃之前所有事件的订阅post(Object event)
- 发布一个事件,这个事件会被所有标记了@Subscribe注解的方法获得
使用Otto事件总线
首先添加依赖:
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile files('libs/volly-1.0.11.jar') compile 'com.squareup:otto:1.3.8' }
为Bus创建一个单例对象
public class BusProvider { private static Bus bus; public static Bus getInstance(){ if (bus == null){ synchronized (BusProvider.class) { bus = new Bus(); } } return bus; } }
创建一个Bean,用来传递各类间的数据
public class EventData { private String content; public EventData() { } public EventData(String content) { this.content = content; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } }
在MainActivity中注册并且创建订阅者订阅数据
public class MainActivity extends AppCompatActivity { private TextView tvShow; private Button btnJump; private void init(){ tvShow= (TextView) findViewById(R.id.tvShow); btnJump = (Button) findViewById(R.id.btnJump); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); BusProvider.getInstance().register(this); setContentView(R.layout.activity_main); this.init(); btnJump.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(getApplicationContext(),SecondActivity.class)); } }); } @Subscribe public void subscribeEvent(EventData data){ Log.e("L",data.getContent()); tvShow.setText(data.getContent()); } @Override protected void onDestroy() { super.onDestroy(); BusProvider.getInstance().unregister(this); } }
通过post()来发布事件,它不需要注册和注销,而且它不会在界面跳转时马上发布事件,而是我们人为的控制该事件什么时候发布
public class SecondActivity extends AppCompatActivity { private EditText etInput; private Button btnBack; String content; private void init(){ etInput = (EditText) findViewById(R.id.etInput); btnBack = (Button) findViewById(R.id.btnBack); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); this.init(); btnBack.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { content = etInput.getText().toString(); if(content != null){ EventData data = new EventData(); data.setContent(content); BusProvider.getInstance().post(data); finish(); }else{ return; } } }); } }
OK..