android–Greenrobot的Eventbus:两个片段调用异步任务工作让Eventbus感到困惑

android–Greenrobot的Eventbus:两个片段调用异步任务工作让Eventbus感到困惑,第1张

概述我目前正在处理使用FragmentPagerAdapter在Activities下创建的Fragments.我使用GreenRobot的EventBus3.0来返回我从服务类创建的一些AsyncTasks.但是,由于这两个片段是一个接一个地创建的,因此事件总线’poststicky’的返回使得已订阅的片段混合起来.我已经搜索了stackoverflow,

我目前正在处理使用FragmentPagerAdapter在ActivitIEs下创建的Fragments.我使用GreenRobot的EventBus 3.0来返回我从服务类创建的一些AsyncTasks.但是,由于这两个片段是一个接一个地创建的,因此事件总线’post sticky’的返回使得已订阅的片段混合起来.我已经搜索了stackoverflow,做了其他人所做的事情(例如将eventBus寄存器放到onStart和OnStop等等),我仍然看不到类似的问题.希望您能够帮助我.谢谢!

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

1.状态碎片

@OverrIDepublic 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);}@OverrIDepublic voID onStop() {    Log.e(TAG, "onStop");    eventBus.unregister(this);    super.onStop();}

2.状态服务 – 状态片段的服务类

public voID getStatusList () {    Log.e(LOG_TAG, "getStatusList");    //do some async tasks here    returnList(statuses);}private voID returnList(List<Status> statuses) {    Log.e(LOG_TAG, "returnList");    eventBus.poststicky(statuses);}

3.图表碎片

@OverrIDepublic 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);}@OverrIDepublic voID onStop() {    eventBus.unregister(this);    super.onStop();}

4.图表服务

public voID getDateResult(final DbRequest dbRequest) {    Log.e(LOG_TAG, "getDateResult");    //do some async tasks    returnResults(results);}private voID returnResults(List<Result> results) {    Log.e(LOG_TAG, "returnResults");    eventBus.poststicky(results);}

5.结果类

public class Result {      ....}

6.状态类

public class Status {    ...}

因此,每次创建片段时,他们都会调用他们的服务类,而服务类又会发布List< Status>和列表<结果>几乎一个接一个.由于这个原因,它引起了混乱

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 onCreate03-11 11:48:19.589  15148-15148/com.paularagones.moode E/Moode-StatusFragment﹕ StatusFragment onCreateVIEw03-11 11:48:19.605  15148-15148/com.paularagones.moode E/StatusService﹕ getStatusList03-11 11:48:19.609  15148-15148/com.paularagones.moode E/ChartFragment﹕ onCreateVIEw03-11 11:48:19.613  15148-15148/com.paularagones.moode E/ChartService﹕ newInstance03-11 11:48:19.621  15148-15148/com.paularagones.moode E/ChartService﹕ getDateResult03-11 11:48:19.681  15148-15148/com.paularagones.moode E/RecyclerVIEw﹕ No adapter attached; skipPing layout03-11 11:48:19.681  15148-15148/com.paularagones.moode E/StatusService﹕ returnList03-11 11:48:19.681  15148-15148/com.paularagones.moode E/Moode-StatusFragment﹕ onReturnList03-11 11:48:19.681  15148-15148/com.paularagones.moode E/ChartFragment﹕ onReturnResults03-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.access0(StatusService.java:24)            at com.paularagones.moode.Services.StatusService.onNext(StatusService.java:72)            at com.paularagones.moode.Services.StatusService.onNext(StatusService.java:59)            at rx.Observable.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.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﹕ returnResults03-11 11:48:19.685  15148-15148/com.paularagones.moode E/Moode-StatusFragment﹕ onReturnList03-11 11:48:19.685  15148-15148/com.paularagones.moode E/ChartFragment﹕ onReturnResults03-11 11:48:19.693  15148-15148/com.paularagones.moode E/StatusRecyclerAdapter﹕ onCreateVIEwHolder03-11 11:48:19.697  15148-15148/com.paularagones.moode E/StatusRecyclerAdapter﹕ onBindVIEwHolder03-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< Result>结果)方法中的粘性…不确定这是否有意…但认为应该提到它.

我想强调的主要观点是,有两个onEvent()方法利用相同的通用类List<> – 这可能是一个问题 – 一个小的代码更改和快速测试可以验证这一点

为每个List<>创建一个类

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; }}

更新onEvent()方法签名:

public voID onReturnList(Statuses statuses)public voID onReturnResults(Results results)

更新.poststicky()方法调用:

eventBus.poststicky(new Statuses(statuses));eventBus.poststicky(new Results(results));

当然,您需要从其类成员访问列表(例如):

foreach (var status in statuses.List)

foreach (var result in results.List)

如果你看到的问题在这些改变之后就消失了 – 那么假设greenrobot的EventBus在callstack中看到的反射调用期间没有考虑泛型List类中包含的类型是有意义的.它可能只是寻找包含List参数的第一个匹配签名;当有2个或更多匹配时,正确的匹配可能不会被调用.

这是猜测;所以你必须尝试一下,看看它是否有帮助 – 但是当我需要List<>类以避免歧义时,我已经成功地在使用这种类型的实现的项目中使用greenrobot的EventBus.

总结

以上是内存溢出为你收集整理的android – Greenrobot的Eventbus:两个片段调用异步任务工作让Eventbus感到困惑全部内容,希望文章能够帮你解决android – Greenrobot的Eventbus:两个片段调用异步任务工作让Eventbus感到困惑所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/1119448.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存