Fragment通信

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




猜你喜欢

转载自blog.csdn.net/cdye_1234/article/details/80074328