总线实现...检查片段平等...或类似的东西

时间:2013-07-16 16:39:56

标签: android reflection bus

我为我的应用程序实现了一个总线,用于片段和活动之间的通信。我通过向列表添加FragmentActivity的实例来添加订阅者。然后我遍历该列表,调用一个方法来通知每个订阅者正在发生的事情。现在我需要保持列表清洁,我不想在列表中添加同一类的多个实例。我可以使用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);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

好的,我找到了适合我的问题的答案。我想在这里分享一下,希望能帮助其他人。 Android有一个名为LocalBroadcastManager的类。它在v4支持库中提供。在您的活动中,您调用'LocalBroadcastManager.getInstance()。registerReceiver()'。你将一个扩展BroadcastReceiver的类和一个'IntentFilter'告诉接收者要监听的内容。然后在包括Fragment的任何课程中,您拨打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 developer网站上找到有关如何使用它的更多信息。