有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java EventBus事件生命周期中的一些问题

我使用这个库greenrobot/EventBus保存数据并在不同的活动中传递数据。在本例中,我使用EventBus传递“订单”和 联合活动中某些活动的“cartItems”对象自定义模型

在这个活动中,我有一个方法,它需要分布在这两个对象中的值,但这些对象在不同的事件中调用,如下所示。我尝试在两个事件中调用此方法updateUI(),但其中一个对象始终为NULL

当所有对象都已设置好时,是否可能有一个事件

欢迎对EventBus中事件生命周期如何工作的详细解释

    @Subscribe(sticky = true)
    public void onOrderEvent(Order order) {
        this.order = order;
        updateUI();
    }


    @Subscribe(sticky = true)
    public void onBasketProductsEvent(Products products) {
        this.basketProducts = products;
        updateUI();
    }

    private void updateUI() {
        double subtotal = getSubTotalPrice(basketProducts.getProducts());
        double taxPrice = getTaxPrice(subtotal,order.getTax());
    }

当我在这两个事件中调用此方法时,我有一些NullPointerException,因为对象中的一个总是null


共 (2) 个答案

  1. # 1 楼答案

    When I call this method in both events I have some NullPointerException because always one of object is null.

    这是意料之中的行为。这是因为this.orderthis.basketProducts尚未初始化

    您需要记住,无论何时发布活动,都会呼叫订阅者。例如,当您拨打以下电话时:

    EventBus.getDefault().postSticky(new Order());
    

    然后onOrderEvent(Order order)订户将立即被呼叫。在上述情况下发生了以下情况:

    • 订单事件已发布
    • 订户onOrderEvent(Order order)
    • this.order已初始化
    • ^调用{}时this.basketProducts尚未初始化
    • NullPointerException被引发

    一个简单的修复可以通过检查这两个参数是否都满足这一点来完成。命令or这个。basketProductsare already initialized before calling theupdateUI`。比如:

    private void updateUI() {
    
        // don't do update when both the required values is null.
        if(order == null || basketProducts == null) {
          return;
        }
    
        double subtotal = getSubTotalPrice(basketProducts.getProducts());
        double taxPrice = getTaxPrice(subtotal,order.getTax());
    }
    

    我认为让您对EventBus机制有点困惑的原因是sticky标志。请查看http://greenrobot.org/eventbus/documentation/configuration/sticky-events/了解详细信息

  2. # 2 楼答案

    尽管我试图检查强制值是否为空,如下所示:

        private void updateUI() {
    
        if(order == null || basketProducts == null) {
          return;
        }
    
        double subtotal = getSubTotalPrice(basketProducts.getProducts());
        double taxPrice = getTaxPrice(subtotal,order.getTax());
    }
    

    这种方法从未执行过。我不知道为什么会发生这种情况,也许在初始化变量之前,它们同时存在。如果有人知道为什么会发生这种情况,请随时发表评论

    无论如何,我找到了解决这个问题的办法

    我们可以在onCreate(Bundle savedInstanceState)方法中手动获取粘性事件,这将使所有值同时初始化,并且我们可以在初始化值后调用所需的方法,如下所示:

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            //get basketProducts sticky Event manually
            basketProducts = EventBus.getDefault().getStickyEvent(Products.class);
    
            //get order sticky Event manually
            order = EventBus.getDefault().getStickyEvent(Order.class);
    
            if(order != null && basketProducts != null) {
               updateUI();
            }
    
        }