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,希望大神帮助完善,小白共同学习