Отто не звонит на @Subscribe
Я работаю в базовом проекте Hello Otto, чтобы немного узнать, как он работает. Это мой BusProvider поверх Otto 7.0.1. В MainActivity у меня две кнопки, после нажатия на первую я выкладываю строку в объект bus. Это мой BusProvider
public class BusProvider {
private BusProvider() {}
private static Bus bus;
public static Bus getInstance() {
if (bus == null){
bus = new Bus();
}
return bus;
}
}
MainActivity, которая отправит строку в Main2Activity с использованием класса шины
public class MainActivity extends AppCompatActivity {
private Bus bus;
@Bind(R.id.myButton)Button mButton;
@Bind(R.id.button2)Button mButton2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setLibreries();
this.bus = BusProvider.getInstance();
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onResume() {
super.onResume();
}
public void setLibreries(){
ButterKnife.bind(this);
}
@OnClick(R.id.myButton)
protected void buttonPressed1( ){
Toast.makeText(this, "click on the 1 button",Toast.LENGTH_SHORT).show();
BusProvider.getInstance().post("HELLO OTTO");
Intent intent = new Intent(MainActivity.this,Main2Activity.class);
startActivity(intent);
}
@OnClick(R.id.button2)
protected void buttonPressed(){
Toast.makeText(this, "click on the 2 button",Toast.LENGTH_SHORT).show();
}
}
Main2Activity как получает строку
public class Main2Activity extends AppCompatActivity {
private Bus bus;
@Bind(R.id.this_is_a_text_view) TextView myTextButter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
bus = BusProvider.getInstance();
ButterKnife.bind(this);
myTextButter.setText("HELLO");
}
@Override
protected void onResume() {
BusProvider.getInstance().register(this);
super.onResume();
}
@Override
protected void onPause() {
super.onPause();
BusProvider.getInstance().unregister(this);
}
@Subscribe
public void gettingStringPosted(String message){
Log.d("OTTO", "OTTO subscribe has been called "+message);
Toast.makeText(this,message,Toast.LENGTH_SHORT).show();
}
}
Проблема в том, что тост с сообщением, которое я отправляю в MainActivity в Main2Activity
ПРИВЕТ ОТТО
никогда не показывается.
Что я делаю не так?
2 ответа
Проблема в том, что ваша Main2Activity еще не была зарегистрирована в Otto, когда ваш BusProvider.getInstance().post("HELLO OTTO");
линия приходит.
Вот как работает ваш код:
- Bus.post ()
- Bus.register ()
Вот как это должно быть:
- Bus.register ()
- Bus.post ()
Вы не можете решить это, перемещая линию BusProvider.getInstance().post("HELLO OTTO");
под startActivity()
позвони, потому что Activity.onResume()
может не быть вызван сразу, поэтому ваш регистрационный вызов (в onResume) все еще может произойти после пост-вызова. Я надеюсь, что это имеет смысл для вас.
Это всего лишь пример отто, чтобы понять, как оно есть. Предположим, у вас есть услуга, и вы получаете информацию о ней и отправляете ее на мероприятия.
public class TrackingService extends Service {
Bus bus;
LocationListener mListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
bus.post(new MyLocation(location));
}
};
// Other service related methods..
}
И активность
@Override
protected void onResume() {
BusProvider.getInstance().register(this);
super.onResume();
}
@Override
protected void onPause() {
super.onPause();
BusProvider.getInstance().unregister(this);
}
@Subscribe
public void locationChanged(MyLocation location){
Toast.makeText(this, "you got new location", Toast.LENGTH_SHORT).show();
}
Вот только это.
Кстати, и это то, что я упомянул для вас в моем комментарии
В MainActivity
Intent intent = new Intent(getBaseContext(), Main2Activity.class);
intent.putExtra("MY_INFO", "INFO");
startActivity(intent)
В Main2Activity
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.view);
Intent intent = getIntent();
String info = intent.getStringExtra("MY_INFO");
}