在 ViewPager 中使用 EventBus 时获取混合数据
Getting mixed data when using EventBus in a ViewPager
我正在使用 EventBus 来 post 当一个 http 请求成功发出时,结果到一个片段。当存在一个订阅者和一个发布者关系时,这很好用。
但是,在我的应用程序中,我有一个使用带有选项卡的 ViewPager
的屏幕。而且因为页面非常相似,所以我使用相同的片段,每个标签对应不同的参数,来下载数据。
片段看起来是这样的:
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);
}
}
您可能已经猜到接收数据时会发生什么。
由于有许多具有相同签名的订阅者,等待 ServerResponse
,响应不会转到相应的选项卡,但会收到相同的响应并显示在每个片段中,数据得到混合。
你知道如何解决这个问题吗?
嘿!同样的问题,但我有解决办法。
问题是你有很多Fragments
(来自同一个对象的实例)并且它们都在监听同一个事件,所以当你post一个事件时它们都会更新.
当您 post 一个事件时,尝试发送一个位置,当您实例化您的 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());
}
}
我正在使用 EventBus 来 post 当一个 http 请求成功发出时,结果到一个片段。当存在一个订阅者和一个发布者关系时,这很好用。
但是,在我的应用程序中,我有一个使用带有选项卡的 ViewPager
的屏幕。而且因为页面非常相似,所以我使用相同的片段,每个标签对应不同的参数,来下载数据。
片段看起来是这样的:
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);
}
}
您可能已经猜到接收数据时会发生什么。
由于有许多具有相同签名的订阅者,等待 ServerResponse
,响应不会转到相应的选项卡,但会收到相同的响应并显示在每个片段中,数据得到混合。
你知道如何解决这个问题吗?
嘿!同样的问题,但我有解决办法。
问题是你有很多Fragments
(来自同一个对象的实例)并且它们都在监听同一个事件,所以当你post一个事件时它们都会更新.
当您 post 一个事件时,尝试发送一个位置,当您实例化您的 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());
}
}