我昨天开始使用Square的OTTO,到目前为止,我有一个良好的开端。
当您的片段已经托管在FragmentActivity中并且您只需要在FragmentActivity托管的Fragment之间进行通信时,Otto可以很好地开箱即用。
托管时,您的#onResume()Methode被调用,Fragment可以在Eventbus上注册:
@Override
public void onResume()
{
super.onResume();
BusProvider.getInstance().register(this);
}
我的问题:
嵌入在额外活动中的片段应该通过Eventbus接收事件,如下所示:
public AnotherFragmentHostedInSomeActivity extends Fragment
{
.....
@Subscribe
public void onSomethingHappend(final Event event)
{
final SomeObject deliveredObject = event.getSomeObject();
但是当你想在那里调用另一个活动托管片段时,事情仍然很复杂:
public class SomeFragmentSendingDataToAnotherFragment extends Fragment
{
...
private void sendData()
{
final Intent intent = new Intent(applicationContext, SomeActivity.class);
applicationContext.startActivity(intent);
BusProvider.getInstance().post(new Event(someObject));
正如您可能已经看到的,此代码很狡猾。启动一个Activity然后将Data发送到该Activity托管的Fragment,因为生命周期不能正常工作。因此,活动也会被创建,而Fragements也会被创建。有时会调用onResume Methode,因此Fragement可以使用@Subscribe注册。但这一切都发生在之后事件已经通过EventBus发布。因此,拦截的片段永远不会被EventBus调用。
任何人都知道如何以聪明的方式做到这一点?
那里有一些额外的信息: 昨天我和OTTO进行了很好的比赛。当我需要将数据发送到另一个活动时,问题只出现在我的项目中,在我的情况下,当APP在智能手机上运行时,而不是平板电脑上运行。在我通过Intent和Parcelable发送所有数据之前。 Otto会减少编写Parcleable Objects的需求,所以我想这样做。
感谢答案
答案 0 :(得分:16)
到第二个Activity开始时,原来的Activity就消失了。正如其他人所指出的,如果你想将数据从Activity传递给Activity,那么使用Intents可能是最好的途径。
如果你真的想要一个事件总线,你需要一个即使在第一个活动消失后仍然存活的对象。在Android中,这与应用程序上下文相关联,或者如果使用Dagger或Guice,则为@Singleton。
这个单身人士是你使用Otto的@Produce注释的地方。当第二个Activity订阅总线时,它将从该@Produce方法接收任何数据。
答案 1 :(得分:1)
您可以查看Jake Wharton在Otto github issue上发布的答案。 你可以使用@Producer。
当您发出HTTP请求并将响应缓存在某处时(例如,员工列表)。大多数人会启动请求,并在某些回调响应时直接执行活动。当onPause之后和onResume之前发生回调时会出现问题,就像旋转设备时发生的那样。你可以做的是,当HTTP调用在总线上返回时发布一个事件,这样任何人都可以收听它并将它发送到缓存。然后,如果任何新订阅者对响应感兴趣,您可以让生产者与缓存进行通信以生成HTTP调用的结果。这样,当您暂停活动(并取消注册)并进行呼叫返回时,一旦您恢复(并重新注册),您的生产者将被调用并且将通知活动。
答案 2 :(得分:0)
您是否尝试过使用@Produce注释?当第二个Activity中的Fragment在总线上注册时,任何具有相应@Produce方法的@Subscribe方法都将被运行。