观察者模式与Fragment间通信

11 篇文章 0 订阅
3 篇文章 0 订阅
本文介绍了如何使用观察者模式实现Fragment间的低耦合通信。通过在Fragment中定义接口,由Activity实现该接口作为中介,从而在Fragment之间传递信息,降低了代码的耦合度。同时,文章还探讨了其他通信方式,如通过FragmentManager、广播和Handler。
摘要由CSDN通过智能技术生成
     前几天面试,面试官提到一个问题,fragment间怎样实现通信。我回答通过Activity做中介。面试官要求用低耦合的方式,一时没想起。后来上网找了一下发现可以通过观察者模式来实现。虽然也是通过Activity做中介,但是不是直接在Fragment中通过操控另一个Fragment方式,而是在fragment中定义一个接口,然后Activity实现这个接口即可实现通信。果然还是有太多的东西要学,不能停!

介绍
     观察者模式是一个使用率非常高的模式,最长用于GUI系统、订阅-发布系统。这个模式的一个重要作用就是解耦,将被观察者和观察者解耦,使得他们之间的依赖性更小。


定义
     定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。


使用场景
     ①、关联行为场景,指的是可拆分的,而不是“组合”关系
     ②、事件多级触发场景
     ③、跨系统的消息交换场景,如消息队列、时间总线的处理机制


简单实现:
     一个技术网站提供更新订阅功能,程序员可以通过订阅,收到该网站每周更新的周报。

     首先是观察者,观察者需实现Observer接口,Observer是JDK中的内置类型。然后重写其中的update方法。

public class Coder implements Observer {
    String name;

    public Coder(String name) {
        this.name = name;
    }

    @Override
    public void update(Observable o, Object arg) {
        Log.e("Observer", name + "收到更新了:" + arg);
    }
}
     
     被观察者是这个网站,继承自Observable类,也是JDK中的内置类型
class DevTechFrontier extends Observable {
    public void postNewWeekly(String content) {
        setChanged();
        notifyObservers(content);
    }
}
     
     当多个Coder订阅周报时,该网站实例DevTechFrontier将他们通过addObserver方法注册进来。当该网站有更新时,调用postNewWeekly(String)方法,即可以通知到所有的Coder。



源码观察
     Observer:Observer接口只有一个update()方法。该方法会在每次被观察对象发生改变的时候被调用。

      Observable:Observable类也比较简单,主要方法是notifyObservers()。在该方法中,会先判断hasChanged标识是否为真(DevTechFrontier中的postNextWeekly方法中,调用了setChanged()方法,会将hasChanged标识置为true),如果是真,则获取注册到观察者列表中的观察者,遍历通知这些观察者(即调用它们的update(Observable, Object)方法)。代码如下:

public void notifyObservers(Object arg) {
    /*
    * a temporary array buffer, used as a snapshot of the state of
    * current Observers.
    */
    Observer[] arrLocal;

    synchronized (this) {
        if (!hasChanged())
            return;

        arrLocal = observers.toArray(new Observer[observers.size()]);
        clearChanged();
    }

    for (int i = arrLocal.length-1; i>=0; i--)
        arrLocal[i].update(this, arg);
}



Fragment间通信的实现
    通过观察者模式实现
     看了上面观察者模式的例子,就知道可以套用在Fragment间通信情景中。与Fragment中直接操作另一个Fragment相比,通过观察者模式可以降低代码之间的耦合。大致步骤如下:
    
  I、Fragment中定义一个接口:
public interface FragmentListener {
    void changeFg2Text();
}
 
  II、Activity实现该接口:
public class MainActivity extends AppCompatActivity implements Fragment1.FragmentListener{
@Override
public void changeFg2Text() {
    ((Fragment2)mDatas.get(1)).setTitle("changed!");  //先获取到Fragment2的实例,然后调用其中方法
}
}
 
III、在Fragment的onAttach()对传进来的Activity进行接口转换:
@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if(context != null){
        mListener = (MainActivity)context;
    }
}

   观察者模式能够将两个Fragment解耦,是比较好的方案。除此之外还可以
     ①、通过FragmentManager获取另一个Fragment的实例,然后调用其内部方法来实现通信; //需要是通过xml文件定义的fragment,通过FragmentManager.findFragmentById方式通信。
     ②、使用广播实现通信;
     ③、Activity做中介,使用Handler与Activity通信。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值