首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Otto运行时异常

Otto运行时异常
EN

Stack Overflow用户
提问于 2014-05-13 06:38:07
回答 1查看 2K关注 0票数 0

我的应用程序到处都在使用Otto,但我总是遇到相同的运行时异常崩溃。这发生在几个不同的事件中,这让我认为我没有正确地实现otto。我正在使用主线程总线技术,如下所示:

代码语言:javascript
复制
/**
 * Otto bus that enforces bus messages posted on the main thread
 * Adapted from: http://stackoverflow.com/questions/15431768/how-to-send-event-from-service-to-activity-with-otto-event-bus
 */
public class MXRMainThreadBus extends Bus {
    private final Bus mBus;
    private final Handler mHandler = new Handler(Looper.getMainLooper());

    public MXRMainThreadBus(final Bus bus) {
        if (bus == null) {
            throw new NullPointerException("bus must not be null");
        }
        mBus = bus;
    }

    @Override public void register(Object obj) {
        mBus.register(obj);
    }

    @Override public void unregister(Object obj) {
        mBus.unregister(obj);
    }

    @Override public void post(final Object event) {
        if (Looper.myLooper() == Looper.getMainLooper()) {
            mBus.post(event);
        } else {
            mHandler.post(new Runnable() {
                @Override public void run() {
                    mBus.post(event);
                }
            });
        }
    }
}

下面是我的总线提供程序:

代码语言:javascript
复制
/**
 * Otto Bus Provider singleton
 */
public class BusProvider {
    private static MXRMainThreadBus BUS;

    private BusProvider() {}

    public static Bus getInstance() {
        if(BUS == null) {
            BUS = new MXRMainThreadBus(new Bus());
        }
        return BUS;
    }
}

下面是堆栈跟踪(最常见的堆栈跟踪):

代码语言:javascript
复制
java.lang.RuntimeException
com.squareup.otto.Bus.throwRuntimeException(Bus.java:444)
com.squareup.otto.Bus.dispatch(Bus.java:374)
com.squareup.otto.Bus.dispatchQueuedEvents(Bus.java:355)
com.squareup.otto.Bus.post(Bus.java:324)
com.myxer.android.unicorn.utils.MXRMainThreadBus.post(MXRMainThreadBus.java:33)
com.myxer.android.unicorn.api.MXRApiController$1.onResponse(MXRApiController.java:173)
com.myxer.android.unicorn.api.MXRApiController$1.onResponse(MXRApiController.java:170)
com.myxer.android.unicorn.volley.GsonRequest.deliverResponse(GsonRequest.java:117)
com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99)
android.os.Handler.handleCallback(Handler.java:725)
android.os.Handler.dispatchMessage(Handler.java:92)
android.os.Looper.loop(Looper.java:137)
android.app.ActivityThread.main(ActivityThread.java:5185)
java.lang.reflect.Method.invokeNative(Native Method)
java.lang.reflect.Method.invoke(Method.java:511)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:564)
dalvik.system.NativeStart.main(Native Method)
Caused by: com.myxer.android.unicorn.fragments.MXRStationGridFragment.onStationReceivedImpl(MXRStationGridFragment.java:142)
com.myxer.android.unicorn.fragments.tabhosted.MXRRelatedStationsGridFragment.onStationReceived(MXRRelatedStationsGridFragment.java:75)
java.lang.reflect.Method.invokeNative(Native Method)
java.lang.reflect.Method.invoke(Method.java:511)
com.squareup.otto.EventHandler.handleEvent(EventHandler.java:89)
com.squareup.otto.Bus.dispatch(Bus.java:372)
com.squareup.otto.Bus.dispatchQueuedEvents(Bus.java:355)
com.squareup.otto.Bus.post(Bus.java:324)
com.myxer.android.unicorn.utils.MXRMainThreadBus.post(MXRMainThreadBus.java:33)
com.myxer.android.unicorn.api.MXRApiController$1.onResponse(MXRApiController.java:173)
com.myxer.android.unicorn.api.MXRApiController$1.onResponse(MXRApiController.java:170)
com.myxer.android.unicorn.volley.GsonRequest.deliverResponse(GsonRequest.java:117)
com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99)
android.os.Handler.handleCallback(Handler.java:725)
android.os.Handler.dispatchMessage(Handler.java:92)
android.os.Looper.loop(Looper.java:137)
android.app.ActivityThread.main(ActivityThread.java:5185)
java.lang.reflect.Method.invokeNative(Native Method)
java.lang.reflect.Method.invoke(Method.java:511)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:564)
dalvik.system.NativeStart.main(Native Method)
EN

回答 1

Stack Overflow用户

发布于 2014-09-04 20:46:59

如果你在另一个线程上运行总线而不是主线程,那么你就会遇到那个异常。Otto总线提供程序在主线程上运行。但是,存在一个包装器,它允许将事件传递到主线程以外的其他线程。当您尝试将消息从正在运行的后台服务传递到UI线程时,这可用于服务。下面是包装器:

代码语言:javascript
复制
public class MainThreadBus extends Bus
  {
    private final Bus     mBus;
    private final Handler mHandler = new Handler(Looper.getMainLooper());

    public MainThreadBus(final Bus bus)
      {
        if (bus == null)
          {
            throw new NullPointerException("bus must not be null");
          }
        mBus = bus;
      }

    @Override
    public void register(Object obj)
      {
        mBus.register(obj);
      }

    @Override
    public void unregister(Object obj)
      {
        mBus.unregister(obj);
      }

    @Override
    public void post(final Object event)
      {
        if (Looper.myLooper() == Looper.getMainLooper())
          {
            mBus.post(event);
          }
        else
          {
            mHandler.post(new Runnable()
              {
                @Override
                public void run()
                  {
                    mBus.post(event);
                  }
              });
          }
      }
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23620072

复制
相关文章

相似问题

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