Otto,与EventBus的使用相似,能在线程间传递数据
一般可以用来代替handler进行数据的传递,可以进行一对多的数据发送,这可以满足有些应用场景。其中Bus对象可以定义为全局的。
一般使用步骤
1.
注册接受者,接受者一般可以在Activity或Fragment
接受者接受数据,用@Subscribe注解
注解下的方法接受的参数就是发布者发送的参数,参数类型要相同或是发布者的父类
public class MainActivity extends AppCompatActivity {
private Button mButton;
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//注册接受者
App.getMainThreadBusInstance().register(this);
mButton = (Button) findViewById(R.id.second);
mTextView = (TextView) findViewById(R.id.receiver);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
}
/**
* 接受者
* @param o
*/
@Subscribe
public void getMessage(Object o) {
if (mTextView != null) {
mTextView.setText((String) o);
Toast.makeText(MainActivity.this, "first activity textview's content change", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
//取消注册
App.getMainThreadBusInstance().unregister(this);
}
}
2、创建发送者,发送数据 ,在要发送的地方调用Bus.post(event),event可以是任意类型
public class SecondActivity extends AppCompatActivity {
private EditText mEditText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Button bUtton = (Button) findViewById(R.id.post);
mEditText = (EditText) findViewById(R.id.edit);
bUtton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String trim = mEditText.getText().toString().trim();
//发送消息,这里是全局的Bus,bus是集成后重写的可以在主线程中运行的Bus
App.getMainThreadBusInstance().post(trim);
}
});
}
}
另:定义一直在接受者可以在主线程得到数据的Bus
public class MainThreadBus extends Bus {
private final Handler mHandler = new Handler(Looper.getMainLooper());
@Override
public void post(final Object event) {
//判断是否是主线程looper,就是本线程是否是主线程
if (Looper.myLooper() == Looper.getMainLooper()) {
super.post(event);
} else {
mHandler.post(new Runnable() {
@Override
public void run() {
MainThreadBus.super.post(event);
}
});
}
}
}