tl;dr
你永远不必担心哪个thread您发布了一个活动,但您必须担心是哪个活动process你发布它来自。您的同步适配器与片段在不同的进程中运行 - EventBus 仅在创建它的进程中工作。
长版
除了订阅事件之外,您永远不需要启动不同的线程,甚至不需要担心您在任何地方使用哪个线程。
check http://greenrobot.org/eventbus/documentation/delivery-threads-threadmode/ http://greenrobot.org/eventbus/documentation/delivery-threads-threadmode/有关更多详细信息,但语法非常不言自明:
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void thisMethodWillBeRunInABackgroundThread(DoLoginEvent event)
{
//Run some code that makes an HTTP request
}
并在 UI 上运行一些东西:
@Subscribe(threadMode = ThreadMode.MAIN)
public void thisMethodWillBeRunOnTheUIThread(LoginSuccessfulEvent event)
{
//Run some code that touches the UI
}
当您调用 post() 来触发两个DoLoginEvent
和LoginSuccessfulEvent
你在哪个线程中绝对不重要。
现在,您面临的真正问题是:订阅对象上似乎没有捕获事件。
我怀疑这是因为您的同步适配器在不同的环境中运行Process。 EventBus 仅在以下范围内运行Process它被创建了。
同步适配器(例如 BroadcastReceiver 或服务)在单独的进程中运行,以允许您与服务器同步数据without与您的应用程序本身的任何交互。这个想法是,即使应用程序关闭,您也可以与服务器同步,将所有内容保存到数据库中,然后当应用程序启动时,它会检查该数据库(快速),而不必与服务器同步(慢速)。但是,如果您的应用程序在同步适配器运行时处于活动状态,那么您想要保存到数据库,同时也告诉应用程序有一些新信息,对吧?
因此,为了允许您的同步适配器与您的应用程序进行通信,我建议您在片段/活动中设置一个 BroadcastReceiver,然后从您的同步适配器广播一个意图。
这个机制和EventBus的概念非常相似,你甚至可以发送粘性意图 https://stackoverflow.com/questions/2584497/what-is-the-difference-between-sendstickybroadcast-and-sendbroadcast-in-android!您的片段会监听这些意图,但仅限于它还活着的时候。如果您的同步适配器在应用程序关闭时发送广播,则不会发生任何事情。但是当片段启动并注册这些意图时,它将获得最后一个sticky one.
public class LogFragment extends Fragment {
private LogReceiver mReceiver;
public class LogReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//you can call the EventBus from in here
}
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mReceiver = new LogReceiver();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
getActivity().registerReceiver(mReceiver, new IntentFilter("com.whatever.whatever"));
return view;
}
@Override
public void onDestroyView() {
getActivity().unregisterReceiver(mReceiver);
super.onDestroy();
}
}
然后从您的同步适配器
Intent sendIntent = new Intent("com.whatever.whatever");
sendIntent.putExtra("SYNC_ADAPTER_EXTRA", "Your sync adapter says hi");
context.sendBroadcast(sendIntent);