0

我已经为我的应用程序实现了一个总线,用于片段和活动之间的通信。我通过将 aFragment或 an的实例添加Activity到列表来添加订阅者。我遍历该列表,调用一个方法来通知每个订阅者正在发生的事情。现在我需要保持列表干净,我不想在列表中添加同一类的多个实例。我可以使用equals()Activity但我不能使用,Fragment因为它是最终的,所以我不能覆盖它。

我尝试过的

我试图Class在列表中保留每个订阅者的对象,在我调用该方法之前它工作正常。你不能调用没有实例的方法来调用它。所以那行不通。

我还可以保留一个单独的列表,一个用于保存Class对象,一个用于保存实际实例。但如果可能的话,我想避免添加另一个依赖项。

我也可以手动instanceof检查每个Fragment,但我不想这样做,因为我已经有 5 个片段,如果我添加或删除任何片段,那么我必须回到这里并更新此方法。

所以我的问题是,除了添加另一个List来保存Class对象或手动instanceof检查之外,还有其他方法可以确保我不会向订阅者添加多个实例List吗?

如果您需要,这是相关代码:

public void subscribe(Object object) {
    if (!mSubscribers.contains(object)) {
        mSubscribers.add(object);
    }
}

public void notifySubscribers(BusEvent event) throws InvocationTargetException, IllegalAccessException {
    for (Object o : mSubscribers) {
        Method methodToCall = getMethodToCall(o);

        if (methodToCall != null) {
            methodToCall.invoke(o, event);
        }
    }
}
4

1 回答 1

0

好的,我找到了适合我的问题的答案。我想在这里分享它,希望它可以帮助其他人。Android 有一个名为LocalBroadcastManager. 它在 v4 支持库中可用。在您的活动中,您调用“LocalBroadcastManager.getInstance().registerReceiver()”。您将一个扩展的类BroadcastReceiver和一个“IntentFilter”传递给该方法,以告诉接收者要听什么。然后在包括Fragments 在内的任何类中调用LocalBroadcastManager.getInstance().sendBroadcast()并传入与您注册时使用的Intent匹配的类IntentFilter。这是我用来让它工作的代码:

private void registerLocalBroadcastReceiver() {
    // call this method in your activity (or any class you want to listen for broadcasts)
    LocalBroadcastManager manager = LocalBroadcastManager.getInstance(this);
    manager.registerReceiver(new OpenMenuBroadcastReceiver(), new IntentFilter("open-html"));
}

private void sendMessageToActivity(int position) {
    // use this in a fragment (or any other class) to send a message
    LocalBroadcastManager broadcast = LocalBroadcastManager.getInstance(getActivity());
    Intent message = new Intent("open-html");
    String name = (String) getListAdapter().getItem(position);

    message.putExtra("name", name);
    broadcast.sendBroadcast(message);
}

class OpenMenuBroadcastReceiver extends BroadcastReceiver {
    // this is an inner class to my activity, when you send the message this method
    // will be called to handle the message
    @Override
    public void onReceive(Context context, Intent intent) {
        String name = intent.getStringExtra("name");
        if (name != null && name.equalsIgnoreCase("home")) {
            replaceFragment(Tag.HOME_FRAGMENT.getTag(), new HomeFragment(), R.id.main_frame);
            mDrawerLayout.closeDrawer(Gravity.START);
            return;
        }
        openMenuItemsFragment(name);
    }
}

这样做的好处是它完全是您的应用程序本地的。外部应用程序无法接收您的广播,因此它是安全的。您可以在Android 开发者网站上找到有关如何使用它的更多信息。

于 2013-08-22T21:07:04.057 回答