首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Otto不调用@订阅

Otto不调用@订阅
EN

Stack Overflow用户
提问于 2016-04-11 11:58:33
回答 2查看 752关注 0票数 0

我正在一个Hello基础项目中工作,以了解它是如何工作的。这是我在Otto 7.0.1上的BusProvider。在MainActivity中,我有两个按钮,点击第一个按钮后,我在总线对象中发布一个字符串。这是我的BusProvider

代码语言:javascript
复制
public class  BusProvider {

    private BusProvider() {}

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

MainActivity将使用总线类向Main2Activity发送字符串。

代码语言:javascript
复制
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如何接收字符串

代码语言:javascript
复制
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

你好奥托

从未出现过。

我做错什么了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-11 12:52:16

问题是,当您的Main2Activity行出现时,您的BusProvider.getInstance().post("HELLO OTTO");还没有注册到Otto。

下面是您的代码的实现方式:

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

它应该是这样的:

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

您不能通过将行BusProvider.getInstance().post("HELLO OTTO");移动到startActivity()调用下来解决这个问题,因为Activity.onResume()可能不会立即被调用,因此您的注册调用(在onResume中)仍然可以在 post调用之后发生。我希望这对你有意义。

票数 1
EN

Stack Overflow用户

发布于 2016-04-11 13:17:48

这只是奥托的一个例子,可以理解。让我们假设您有一个服务,并在其中获取位置并发送到活动。

代码语言:javascript
复制
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.. 

}

和活动

代码语言:javascript
复制
@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中

代码语言:javascript
复制
Intent intent = new Intent(getBaseContext(), Main2Activity.class);
intent.putExtra("MY_INFO", "INFO");
startActivity(intent)

在Main2Activity中

代码语言:javascript
复制
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.view);

    Intent intent = getIntent();
    String info = intent.getStringExtra("MY_INFO");
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36548067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档