Android 绿色机器人&x27;s Eventbus:两个调用异步任务作业的片段混淆了Eventbus

Android 绿色机器人&x27;s Eventbus:两个调用异步任务作业的片段混淆了Eventbus,android,android-fragments,greenrobot-eventbus,greenrobot-eventbus-3.0,Android,Android Fragments,Greenrobot Eventbus,Greenrobot Eventbus 3.0,我目前正在使用FragmentPagerAdapter处理活动下创建的片段。我使用GreenRobot的EventBus3.0返回我从服务类创建的一些异步任务。然而,由于这两个片段是一个接一个地创建的,因此eventbus的post sticky的返回将订阅的片段混淆了。我已经搜索了stackoverflow,做了其他人做的事情(例如,将eventBus寄存器设置为onStart和OnStop,等等),但我仍然看不到类似的问题。希望你能帮助我。谢谢 以下是我的两个片段:(我省略了一些不必要的代码

我目前正在使用
FragmentPagerAdapter
处理
活动下创建的
片段。我使用GreenRobot的EventBus3.0返回我从服务类创建的一些异步任务。然而,由于这两个片段是一个接一个地创建的,因此eventbus的post sticky的返回将订阅的片段混淆了。我已经搜索了stackoverflow,做了其他人做的事情(例如,将eventBus寄存器设置为onStart和OnStop,等等),但我仍然看不到类似的问题。希望你能帮助我。谢谢

以下是我的两个片段:(我省略了一些不必要的代码)

1。状态片段

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    Log.e(TAG, "StatusFragment onCreateView");
    eventBus = EventBus.getDefault();
    eventBus.register(this);
    StatusService statusService = StatusService.newInstance(getContext());
    statusService.getStatusList(); //Async Task to call onReturnAdapter once finished
    return mRecyclerView;
}

@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onReturnList(List<Status> statuses) {
    Log.e(TAG, "onReturnList");
    mAdapter = new StatusRecyclerAdapter(statuses);
    mRecyclerView.setAdapter(mAdapter);
    eventBus.removeStickyEvent(statuses);
}

@Override
public void onStop() {
    Log.e(TAG, "onStop");
    eventBus.unregister(this);
    super.onStop();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    Log.e(LOG_TAG, "onCreateView");

    eventBus = EventBus.getDefault();
    eventBus.register(this);

    chartService = ChartService.newInstance(getContext());
    chartService.getDateResult(new DbRequestFeelings());
    return view;
}

@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onReturnResults(List<Result> results) {
    Log.e(LOG_TAG, "onReturnResults");

    chartService.setupPieChart(results, feelingsPieChart);
}

@Override
public void onStop() {
    eventBus.unregister(this);
    super.onStop();
}
6。状态类

public class Result {
      ....
}
public class Status {
    ...
}
因此,每次创建片段时,他们都会调用他们的服务类,服务类会依次发布
List
List
。因此,它制造了一种混乱,它说

03-11 11:48:19.685  15148-15148/com.paularagones.moode E/EventBus﹕ Could not dispatch event: class java.util.ArrayList to subscribing class class com.paularagones.moode.Fragments.ChartFragment
    java.lang.ClassCastException: com.paularagones.moode.Models.Status cannot be cast to com.paularagones.moode.Models.Result
以下是完整的堆栈跟踪:

03-11 11:48:19.589  15148-15148/com.paularagones.moode E/Moode-StatusFragment﹕ StatusFragment onCreate
03-11 11:48:19.589  15148-15148/com.paularagones.moode E/Moode-StatusFragment﹕ StatusFragment onCreateView
03-11 11:48:19.605  15148-15148/com.paularagones.moode E/StatusService﹕ getStatusList
03-11 11:48:19.609  15148-15148/com.paularagones.moode E/ChartFragment﹕ onCreateView
03-11 11:48:19.613  15148-15148/com.paularagones.moode E/ChartService﹕ newInstance
03-11 11:48:19.621  15148-15148/com.paularagones.moode E/ChartService﹕ getDateResult
03-11 11:48:19.681  15148-15148/com.paularagones.moode E/RecyclerView﹕ No adapter attached; skipping layout
03-11 11:48:19.681  15148-15148/com.paularagones.moode E/StatusService﹕ returnList
03-11 11:48:19.681  15148-15148/com.paularagones.moode E/Moode-StatusFragment﹕ onReturnList
03-11 11:48:19.681  15148-15148/com.paularagones.moode E/ChartFragment﹕ onReturnResults
03-11 11:48:19.685  15148-15148/com.paularagones.moode E/EventBus﹕ Could not dispatch event: class java.util.ArrayList to subscribing class class com.paularagones.moode.Fragments.ChartFragment
    java.lang.ClassCastException: com.paularagones.moode.Models.Status cannot be cast to com.paularagones.moode.Models.Result
            at com.paularagones.moode.Services.ChartService.getData(ChartService.java:147)
            at com.paularagones.moode.Services.ChartService.setupPieChart(ChartService.java:129)
            at com.paularagones.moode.Fragments.ChartFragment.onReturnResults(ChartFragment.java:116)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at org.greenrobot.eventbus.EventBus.invokeSubscriber(EventBus.java:485)
            at org.greenrobot.eventbus.EventBus.postToSubscription(EventBus.java:420)
            at org.greenrobot.eventbus.EventBus.postSingleEventForEventType(EventBus.java:397)
            at org.greenrobot.eventbus.EventBus.postSingleEvent(EventBus.java:370)
            at org.greenrobot.eventbus.EventBus.post(EventBus.java:251)
            at org.greenrobot.eventbus.EventBus.postSticky(EventBus.java:292)
            at com.paularagones.moode.Services.StatusService.returnList(StatusService.java:80)
            at com.paularagones.moode.Services.StatusService.access$100(StatusService.java:24)
            at com.paularagones.moode.Services.StatusService$2.onNext(StatusService.java:72)
            at com.paularagones.moode.Services.StatusService$2.onNext(StatusService.java:59)
            at rx.Observable$30.onNext(Observable.java:8069)
            at rx.observers.SafeSubscriber.onNext(SafeSubscriber.java:139)
            at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.pollQueue(OperatorObserveOn.java:202)
            at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber$2.call(OperatorObserveOn.java:162)
            at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
            at android.os.Handler.handleCallback(Handler.java:615)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4745)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)
03-11 11:48:19.685  15148-15148/com.paularagones.moode E/ChartService﹕ returnResults
03-11 11:48:19.685  15148-15148/com.paularagones.moode E/Moode-StatusFragment﹕ onReturnList
03-11 11:48:19.685  15148-15148/com.paularagones.moode E/ChartFragment﹕ onReturnResults
03-11 11:48:19.693  15148-15148/com.paularagones.moode E/StatusRecyclerAdapter﹕ onCreateViewHolder
03-11 11:48:19.697  15148-15148/com.paularagones.moode E/StatusRecyclerAdapter﹕ onBindViewHolder
03-11 11:48:19.709  15148-15148/com.paularagones.moode E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.ClassCastException: com.paularagones.moode.Models.Result cannot be cast to com.paularagones.moode.Models.Status
            at com.paularagones.moode.Adapters.StatusRecyclerAdapter.onBindViewHolder(StatusRecyclerAdapter.java:101)
            at com.paularagones.moode.Adapters.StatusRecyclerAdapter.onBindViewHolder(StatusRecyclerAdapter.java:28)
            at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:5277)
            at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:5310)
            at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4568)
            at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4461)
            at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1962)
            at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1371)
            at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1334)
            at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:563)
            at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2847)
            at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3145)
            at android.view.View.layout(View.java:13754)
            at android.view.ViewGroup.layout(ViewGroup.java:4362)
            at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1627)
            at android.view.View.layout(View.java:13754)
            at android.view.ViewGroup.layout(ViewGroup.java:4362)
            at android.support.design.widget.CoordinatorLayout.layoutChild(CoordinatorLayout.java:1034)
            at android.support.design.widget.CoordinatorLayout.onLayoutChild(CoordinatorLayout.java:744)
            at android.support.design.widget.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:42)
            at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1180)
            at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:757)
            at android.view.View.layout(View.java:13754)
            at android.view.ViewGroup.layout(ViewGroup.java:4362)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
            at android.view.View.layout(View.java:13754)
            at android.view.ViewGroup.layout(ViewGroup.java:4362)
            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1649)
            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1507)
            at android.widget.LinearLayout.onLayout(LinearLayout.java:1420)
            at android.view.View.layout(View.java:13754)
            at android.view.ViewGroup.layout(ViewGroup.java:4362)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
            at android.view.View.layout(View.java:13754)
            at android.view.ViewGroup.layout(ViewGroup.java:4362)
            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1649)
            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1507)
            at android.widget.LinearLayout.onLayout(LinearLayout.java:1420)
            at android.view.View.layout(View.java:13754)
            at android.view.ViewGroup.layout(ViewGroup.java:4362)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
            at android.view.View.layout(View.java:13754)
            at android.view.ViewGroup.layout(ViewGroup.java:4362)
            at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1866)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1687)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:998)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4212)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
            at android.view.Choreographer.doCallbacks(Choreographer.java:555)
            at android.view.Choreographer.doFrame(Choreographer.java:525)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
            at android.os.Handler.handleCallback(Handler.java:615)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4745)
            at java.lang.reflect.Method.invokeNative(Native Method)

你们知道我的代码有什么问题吗?谢谢

我注意到的第一件事是,您没有删除
onReturnResults(List results)
方法中的粘性。。。不确定这是否是故意的。。。但我认为应该提到这一点

我想强调的主要一点是,有两个onEvent()方法利用同一个泛型类
List
——这可能就是问题所在——一个小的代码更改和快速测试可以验证这一点

为每个
列表创建

更新.poststick()方法调用:

eventBus.postSticky(new Statuses(statuses));
eventBus.postSticky(new Results(results));
当然,您需要从他们的类成员访问列表(例如):

如果您看到的问题在进行这些更改后就消失了,那么假设greenrobot的EventBus在调用堆栈中看到的反射调用期间没有考虑泛型List类中包含的类型是有意义的。它可能只是查找包含列表参数的第一个匹配签名;当有2个或更多匹配项时,可能不会调用正确的匹配项


这是猜测;因此,您必须尝试一下,看看它是否有用——但我在一个使用这种实现的项目中成功地使用了greenrobot的EventBus,当我需要类列表以避免歧义时。

结果和状态模型类看起来像什么?(方法代码是不相关的,只是
类……
行都有)@MarcinOrlowski感谢您指出这一点。我已经添加了必要的模型。EventBus的确切版本是什么?关于“粘性”事件,有人提到,“当订户向registerSticky注册时,最后一个粘性事件的传递也会被触发。”“也许是值得考虑的事情。”McCiOrLoSky-这是EngestBuest3.0将稍后检查这一个,如果它工作的话,就回复你。很高兴听到它——你能接受这个答案吗?谢谢
03-11 11:48:19.589  15148-15148/com.paularagones.moode E/Moode-StatusFragment﹕ StatusFragment onCreate
03-11 11:48:19.589  15148-15148/com.paularagones.moode E/Moode-StatusFragment﹕ StatusFragment onCreateView
03-11 11:48:19.605  15148-15148/com.paularagones.moode E/StatusService﹕ getStatusList
03-11 11:48:19.609  15148-15148/com.paularagones.moode E/ChartFragment﹕ onCreateView
03-11 11:48:19.613  15148-15148/com.paularagones.moode E/ChartService﹕ newInstance
03-11 11:48:19.621  15148-15148/com.paularagones.moode E/ChartService﹕ getDateResult
03-11 11:48:19.681  15148-15148/com.paularagones.moode E/RecyclerView﹕ No adapter attached; skipping layout
03-11 11:48:19.681  15148-15148/com.paularagones.moode E/StatusService﹕ returnList
03-11 11:48:19.681  15148-15148/com.paularagones.moode E/Moode-StatusFragment﹕ onReturnList
03-11 11:48:19.681  15148-15148/com.paularagones.moode E/ChartFragment﹕ onReturnResults
03-11 11:48:19.685  15148-15148/com.paularagones.moode E/EventBus﹕ Could not dispatch event: class java.util.ArrayList to subscribing class class com.paularagones.moode.Fragments.ChartFragment
    java.lang.ClassCastException: com.paularagones.moode.Models.Status cannot be cast to com.paularagones.moode.Models.Result
            at com.paularagones.moode.Services.ChartService.getData(ChartService.java:147)
            at com.paularagones.moode.Services.ChartService.setupPieChart(ChartService.java:129)
            at com.paularagones.moode.Fragments.ChartFragment.onReturnResults(ChartFragment.java:116)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at org.greenrobot.eventbus.EventBus.invokeSubscriber(EventBus.java:485)
            at org.greenrobot.eventbus.EventBus.postToSubscription(EventBus.java:420)
            at org.greenrobot.eventbus.EventBus.postSingleEventForEventType(EventBus.java:397)
            at org.greenrobot.eventbus.EventBus.postSingleEvent(EventBus.java:370)
            at org.greenrobot.eventbus.EventBus.post(EventBus.java:251)
            at org.greenrobot.eventbus.EventBus.postSticky(EventBus.java:292)
            at com.paularagones.moode.Services.StatusService.returnList(StatusService.java:80)
            at com.paularagones.moode.Services.StatusService.access$100(StatusService.java:24)
            at com.paularagones.moode.Services.StatusService$2.onNext(StatusService.java:72)
            at com.paularagones.moode.Services.StatusService$2.onNext(StatusService.java:59)
            at rx.Observable$30.onNext(Observable.java:8069)
            at rx.observers.SafeSubscriber.onNext(SafeSubscriber.java:139)
            at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.pollQueue(OperatorObserveOn.java:202)
            at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber$2.call(OperatorObserveOn.java:162)
            at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
            at android.os.Handler.handleCallback(Handler.java:615)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4745)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)
03-11 11:48:19.685  15148-15148/com.paularagones.moode E/ChartService﹕ returnResults
03-11 11:48:19.685  15148-15148/com.paularagones.moode E/Moode-StatusFragment﹕ onReturnList
03-11 11:48:19.685  15148-15148/com.paularagones.moode E/ChartFragment﹕ onReturnResults
03-11 11:48:19.693  15148-15148/com.paularagones.moode E/StatusRecyclerAdapter﹕ onCreateViewHolder
03-11 11:48:19.697  15148-15148/com.paularagones.moode E/StatusRecyclerAdapter﹕ onBindViewHolder
03-11 11:48:19.709  15148-15148/com.paularagones.moode E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.ClassCastException: com.paularagones.moode.Models.Result cannot be cast to com.paularagones.moode.Models.Status
            at com.paularagones.moode.Adapters.StatusRecyclerAdapter.onBindViewHolder(StatusRecyclerAdapter.java:101)
            at com.paularagones.moode.Adapters.StatusRecyclerAdapter.onBindViewHolder(StatusRecyclerAdapter.java:28)
            at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:5277)
            at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:5310)
            at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4568)
            at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4461)
            at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1962)
            at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1371)
            at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1334)
            at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:563)
            at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2847)
            at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3145)
            at android.view.View.layout(View.java:13754)
            at android.view.ViewGroup.layout(ViewGroup.java:4362)
            at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1627)
            at android.view.View.layout(View.java:13754)
            at android.view.ViewGroup.layout(ViewGroup.java:4362)
            at android.support.design.widget.CoordinatorLayout.layoutChild(CoordinatorLayout.java:1034)
            at android.support.design.widget.CoordinatorLayout.onLayoutChild(CoordinatorLayout.java:744)
            at android.support.design.widget.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:42)
            at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1180)
            at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:757)
            at android.view.View.layout(View.java:13754)
            at android.view.ViewGroup.layout(ViewGroup.java:4362)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
            at android.view.View.layout(View.java:13754)
            at android.view.ViewGroup.layout(ViewGroup.java:4362)
            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1649)
            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1507)
            at android.widget.LinearLayout.onLayout(LinearLayout.java:1420)
            at android.view.View.layout(View.java:13754)
            at android.view.ViewGroup.layout(ViewGroup.java:4362)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
            at android.view.View.layout(View.java:13754)
            at android.view.ViewGroup.layout(ViewGroup.java:4362)
            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1649)
            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1507)
            at android.widget.LinearLayout.onLayout(LinearLayout.java:1420)
            at android.view.View.layout(View.java:13754)
            at android.view.ViewGroup.layout(ViewGroup.java:4362)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
            at android.view.View.layout(View.java:13754)
            at android.view.ViewGroup.layout(ViewGroup.java:4362)
            at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1866)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1687)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:998)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4212)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
            at android.view.Choreographer.doCallbacks(Choreographer.java:555)
            at android.view.Choreographer.doFrame(Choreographer.java:525)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
            at android.os.Handler.handleCallback(Handler.java:615)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4745)
            at java.lang.reflect.Method.invokeNative(Native Method)
public class Statuses
{
    List<Status> list;
    public Statuses(List<Status> data) { list = data; }
}

public class Results
{
    List<Result> list;
    public Results(List<Result> data) { list = data; }
}
public void onReturnList(Statuses statuses)
public void onReturnResults(Results results)
eventBus.postSticky(new Statuses(statuses));
eventBus.postSticky(new Results(results));
foreach (var status in statuses.list)
foreach (var result in results.list)