Fragment 通信的方法有多种:
static静态变量:通过读写静态变量的值来达到传值,但是静态变量过多容易造成内存溢出
Broadcast Receiver广播:广播主要是实现不同组件间的通信
接口实现:Fragment 定义callBack接口,Activity实现callBack接口,这样Fragment调用callBack方法时,Activity就可以收到回调
EventBus:能够简化各组件间的通信,让我们的代码书写变得简单,能有效的分离事件发送方和接收方(也就是解耦的意思),能避免复杂和容易出错的依赖性和生命周期问题。EventBus3.0,有四种线程模型,可以在不同线程间进行切换。
MBus:是在学习过程中,学到的,类似于EventBus原理的通信方法,使用也是模仿了EventBus,实现过程只有几十行代码,功能比较简单,可以指定接收对象,但是不支持线程的自由切换。
MBus使用起来也比较简单:
在Activity中
public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //注册 MBus.getDefault().register(this); } /** * 发送一条消息,带有标签“0”的可以接收 * @param view */ public void main(View view) { MBus.getDefault().post("0"); } @Override protected void onDestroy() { super.onDestroy(); //解除注册 MBus.getDefault().unregister(this); } /** * 接收带有标签"1",或者"2"的消息,携带参数message和no,可能内容为null * @param message * @param no */ @Subscriber({"1","2"}) public void fromFragment1(String message,Integer no){ Log.e(TAG,"fromFragment1 message="+message+"no="+no); } /** * 接收带有标签"1"的消息,携带参数message和no,可能内容为null * @param message * @param no */ @Subscriber("2") public void fromFragment2(String message,Integer no){ Log.e(TAG,"fromFragment2 message="+message+"no="+no); } }
在Fragment中
public class Fragment2 extends Fragment { private static final String TAG = "Fragment2"; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view= inflater.inflate(R.layout.f2,null); init(view); MBus.getDefault().register(this); return view; } private void init(View view) { view.findViewById(R.id.f2).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { MBus.getDefault().post("2","message",2); } }); } @Override public void onDestroyView() { super.onDestroyView(); MBus.getDefault().unregister(this); } @Subscriber("0") public void fromMain(){ Log.e(TAG,"fromMain"); } @Subscriber("1") public void fromFragment1(){ Log.e(TAG,"fromFragment1"); } }
源码在github,希望大神帮助完善,小白共同学习