Я работаю над базовым проектом Hello Otto, чтобы немного узнать, как он работает. Это мой BusProvider поверх Otto 7.0.1. В MainActivity у меня есть две кнопки, после нажатия на первую я размещаю строку в объекте шины. Это мой BusProvider

public class  BusProvider {

    private BusProvider() {}

    private static Bus bus;
    public static Bus getInstance() {
        if (bus == null){
            bus = new Bus();
        }
        return bus;
    }
}

MainActivity, который отправит String в 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

ПРИВЕТ ОТТО

Никогда не отображается.
Что я делаю не так?

0
JoCuTo 11 Апр 2016 в 14:58

2 ответа

Лучший ответ

Проблема в том, что ваша Main2Activity еще не была зарегистрирована в Otto, когда приходит ваша строка BusProvider.getInstance().post("HELLO OTTO");.

Вот как работает ваш код:

  1. Bus.post ()
  2. Bus.register ()

Вот как должно быть:

  1. Bus.register ()
  2. Bus.post ()

Вы не можете решить эту проблему, переместив строку BusProvider.getInstance().post("HELLO OTTO"); под вызов startActivity(), потому что Activity.onResume() может быть вызван не сразу, поэтому ваш вызов регистра (в onResume) все еще может произойти после отправить звонок. Я надеюсь, что это имеет для вас смысл.

1
vilpe89 11 Апр 2016 в 13:02

Это всего лишь пример otto, чтобы понять, как оно есть. Предположим, у вас есть служба, в которой вы получаете местоположение и отправляете действиям.

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");
}
1
blackkara 11 Апр 2016 в 13:17