0

我对ott+activity+fragment. 1 有疑问。我打开 Activity 并在 onCreate 中注册 otto。

Observer.getInstance().register(this);

2. 如果我的方法完成,我将向服务器发送请求

@Override
    public void didScanBarcode(String barcode, String symbology) {
      ...
        ItemApiConnector.me().getItem(cleanedBarcode);
    }

3.在这个方法中等待

@Subscribe(MessageType.ITEM_SUCCESS)
    public void getItemFromServer(Item item) {
        Fragment fragment =  ItemFragment.newInstance(item);
        setFragment(fragment);
}

4. 我的片段

public class ItemFragment extends Fragment {
    private Item item;
    private TextView tvName;
    private TextView tvPrice;
    private ImageView itemImage;
    private DisplayImageOptions options;
    AnimateFirstDisplayListener animateFirstDisplayListener = new AnimateFirstDisplayListener();

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.item_info, container, false);
        Bundle bundle = getArguments();
        item  = (Item) bundle.getSerializable("item");
        tvName = (TextView) rootView.findViewById(R.id.tvItemName);
        tvPrice = (TextView) rootView.findViewById(R.id.tvPrice);
        itemImage = (ImageView) rootView.findViewById(R.id.itemImage);
        tvName.setText(item.getName());
        tvPrice.setText("$"+item.getPrice());
        options = ILOptions.getOption();
        ImageLoader.getInstance().displayImage(item.getImage(), itemImage, options,         animateFirstDisplayListener);
        return rootView;
    }

    public static ItemFragment newInstance(Item item) {
        ItemFragment f = new ItemFragment();
        Bundle b = new Bundle();
        b.putSerializable("item", item);
        f.setArguments(b);
        return f;
    }
}

第一次一切正常。然后我关闭活动。再次打开。和一个错误

java.lang.RuntimeException: Could not dispatch event: class com.skip.client.models.Item to handler [EventHandler public void com.skip.client.customer.activities.ScanActivity.getItemFromServer(com.skip.client.models.Item)]: Can not perform this action after onSaveInstanceState
            at com.skip.client.core.otto.Bus.throwRuntimeException(Bus.java:458)
            at com.skip.client.core.otto.Bus.dispatch(Bus.java:388)
            at com.skip.client.core.otto.Bus.dispatchQueuedEvents(Bus.java:369)
            at com.skip.client.core.otto.SkipBus.post(SkipBus.java:52)
            at com.skip.client.core.Observer.send(Observer.java:26)
            at com.skip.client.connector.DefaultCallback.onSuccess(DefaultCallback.java:134)
            at com.skip.client.connector.DefaultCallback.success(DefaultCallback.java:55)
            at com.skip.client.connector.DefaultCallback.success(DefaultCallback.java:23)
            at retrofit.CallbackRunnable$1.run(CallbackRunnable.java:45)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:149)
            at android.app.ActivityThread.main(ActivityThread.java:5257)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
            at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1365)
            at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1383)
            at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:636)
            at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:615)
            at com.skip.client.customer.activities.ScanActivity.setFragment(ScanActivity.java:128)
            at com.skip.client.customer.activities.ScanActivity.getItemFromServer(ScanActivity.java:135)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.skip.client.core.otto.EventHandler.handleEvent(EventHandler.java:89)
            at com.skip.client.core.otto.Bus.dispatch(Bus.java:386)
            at com.skip.client.core.otto.Bus.dispatchQueuedEvents(Bus.java:369)
            at com.skip.client.core.otto.SkipBus.post(SkipBus.java:52)
            at com.skip.client.core.Observer.send(Observer.java:26)
            at com.skip.client.connector.DefaultCallback.onSuccess(DefaultCallback.java:134)
            at com.skip.client.connector.DefaultCallback.success(DefaultCallback.java:55)
            at com.skip.client.connector.DefaultCallback.success(DefaultCallback.java:23)
            at retrofit.CallbackRunnable$1.run(CallbackRunnable.java:45)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:149)
            at android.app.ActivityThread.main(ActivityThread.java:5257)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
            at dalvik.system.NativeStart.main(Native Method)
4

1 回答 1

3

我建议您在onResume和中注册和取消注册 otto onPause。如果我做对了,您的代码将像这样工作:

  1. 您在onCreate.
  2. 发生了一些事情,它工作正常。
  3. 应用程序进入后台,通常如果Activity对象被销毁并作为垃圾收集是可以的,但是 otto 持有它的引用,所以 gc 无法收集它。
  4. 再次打开应用程序,Activity创建并注册另一个对象
  5. 有些东西触发了一个事件,并且 otto 将它传递给一个应该被销毁但仍然存在的旧活动,因为 otto 持有它的引用。应用程序崩溃异常,因为该活动处于其生命周期的末尾。

总结一下:最好不要保存对可以随时销毁的对象的引用,因此在这种情况下,您应该Activity在应用程序进入后台时取消注册。

于 2015-03-17T06:41:19.207 回答