2

当成功发出 http 请求时,我正在使用EventBus将结果发布到片段。当存在一个订阅者和一个发布者关系时,这很有效。

但是,在我的应用程序中,我有一个使用ViewPager选项卡的屏幕。而且由于页面非常相似,我使用相同的片段,每个选项卡对应不同的参数,来下载数据。

Fragment 看起来是这样的:

public class MyFragment extends Fragment{
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);    
        EventBus.getDefault().register(this);
    }

    public void onEvent(ServerResponse response) {
        updateUi(response);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }
}

您可能已经猜到收到数据时会发生什么。

由于有许多具有相同签名的订阅者,等待 a ServerResponse,因此响应不会转到相应的选项卡,但会在每个片段中接收并显示相同的响应,并且数据会混合。

你知道如何解决这个问题吗?

4

1 回答 1

2

嘿!这里有同样的问题,但我有一个解决方案。

问题是你有很多Fragments(来自同一个对象的实例)并且它们都在监听同一个事件,所以当你发布一个事件时它们都会更新。

当你发布一个事件时,尝试发送一个位置,当你实例化Fragment你需要存储页面适配器位置时。只需检查事件是否与您的Fragment.

例如:

public static QuestionFragment newInstance(int position) {
    QuestionFragment fragment = new QuestionFragment();
    Bundle args = new Bundle();
    args.putInt(ARG_POSITION, position);
    fragment.setArguments(args);
    return fragment;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    vMain = inflater.inflate(R.layout.fragment_question, container, false);
    EventBus.getDefault().post(new GetQuestionEvent(mPosition));
    return vMain;
}

public void onEvent(GetQuestionEvent e) {
    if (e.getQuestion().getPosition() == mPosition) {
        TextView tvPostion = (TextView) vMain.findViewById(R.id.tv_position);
        tvPostion.setText("" + e.getQuestion().getPosition());
    }
}
于 2015-02-06T20:07:02.060 回答