Otto 没有调用@Subscribe
Otto does not call to @Subscribe
我正在 Hello Otto 基础项目中工作,以便了解它的工作原理。这是我在 Otto 7.0.1 上的 BusProvider。在 MainActivity 中,我有两个按钮,在点击第一个按钮后,我 post 总线对象中的一个字符串。这是我的 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 class
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如何接收String
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 的消息的 Toast
HELLO OTTO
从未显示。
我做错了什么?
问题是当您的 BusProvider.getInstance().post("HELLO OTTO");
行出现时,您的 Main2Activity 尚未注册到 Otto。
你的代码是这样的:
- Bus.post()
- Bus.register()
应该是这样的:
- Bus.register()
- Bus.post()
您不能通过移动 startActivity()
调用下的行 BusProvider.getInstance().post("HELLO OTTO");
来解决这个问题,因为 Activity.onResume()
可能不会立即被调用,因此您的注册调用(在 onResume 中)仍然可以在 post 调用之后发生。我希望这对你有意义。
这只是 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..
}
和activity
@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");
}
我正在 Hello Otto 基础项目中工作,以便了解它的工作原理。这是我在 Otto 7.0.1 上的 BusProvider。在 MainActivity 中,我有两个按钮,在点击第一个按钮后,我 post 总线对象中的一个字符串。这是我的 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 class
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如何接收String
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 的消息的 Toast
HELLO OTTO
从未显示。
我做错了什么?
问题是当您的 BusProvider.getInstance().post("HELLO OTTO");
行出现时,您的 Main2Activity 尚未注册到 Otto。
你的代码是这样的:
- Bus.post()
- Bus.register()
应该是这样的:
- Bus.register()
- Bus.post()
您不能通过移动 startActivity()
调用下的行 BusProvider.getInstance().post("HELLO OTTO");
来解决这个问题,因为 Activity.onResume()
可能不会立即被调用,因此您的注册调用(在 onResume 中)仍然可以在 post 调用之后发生。我希望这对你有意义。
这只是 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..
}
和activity
@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");
}