我目前正在处理使用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感到困惑所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)