自定义回调一对多的方法

使用场景:
1.在下载的时候,可以通知某个activity进行更新下载进度,或者提示下载完成,如果,需要多多个页面中的fragment进行界面更新,就需要使用多个同时通知
2.在写数据长连接的时候需要在service中使用数据连接,但是需要所有的activity或者fragment中需要获得消息后的回调。
在这些情况下,单个的自定义回调不好实现,可以使用观察者模式来实现。

2,观察者模式需要创建目标和观察者,观察者一般会有多个,一般先创建接口,再在你的一些activity或fragment中实现。

例:
public interface Holder {
public void channelReadListener(String msg);
}

在创建了观察者后可以创建目标

public interface Subject {
    public void addHolder(Holder holder);

    public void RemoveHolder(Holder holder);

    public void updataAllHolder();
}

然后实现下

public class SubjectImp implements Subject {
    private ArrayList<Holder> list = new ArrayList<>();
    private String msg;



    public static SubjectImp imp;

    public static SubjectImp getImp() {
        if (imp == null) {
            imp = new SubjectImp();

        }
        return imp;
    }



    @Override
    public void addHolder(Holder holder) {
        list.add(holder);
    }

    @Override
    public void RemoveHolder(Holder holder) {
        int step = list.indexOf(holder);
        if (step >= 0) {
            list.remove(holder);

        }

    }

    public void RemoveAllHolder() {
        list.clear();

    }

    @Override
    public void updataAllHolder() {
        for (Holder holder
                : list) {
            holder.channelReadListener(msg);
        }
    }

    public void setMsg(String msg) {
        this.msg = msg;
        updataAllHolder();
    }
}

注意:在实现这个目标时需要使用单例的时候,需要考虑线程安全问题,如果想简单,可直接使用饿汉式的模式实现,如果使用懒汉式可以查看这篇文章:

http://blog.csdn.net/cselmu9/article/details/51366946

由于我这里都是在主线程生成,所以不涉及这个问题。

我在service的oncreate() 中使用:
imp = SubjectImp.getImp();

在需要通知的时候 调用下:
imp.setMsg(msg);

在实现过 Holder的activity或fragment中会被回调,一般activity被destory后,holder也不需要使用了,所以在onpause()的时候我RemoveHolder(this),在使用fragment的时候需要同时受到消息,可以不用remove,那么多个fragment就同时得到消息,然后对消息进行处理:

public class FirstActivity extends Activity implements View.OnClickListener, Holder{
  @Override
    public void channelReadListener(final String msg) {

}
  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first);
        imp = SubjectImp.getImp();


    }
   @Override
    protected void onResume() {
        super.onResume();
        imp.addHolder(this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        imp.RemoveHolder(this);
    }
}


public class LoginActivityextends Activity implements View.OnClickListener, Holder{
  @Override
    public void channelReadListener(final String msg) {

}

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        imp = SubjectImp.getImp();

    }
   @Override
    protected void onResume() {
        super.onResume();
        imp.addHolder(this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        imp.RemoveHolder(this);
    }
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值