使用场景:
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();
}
}
注意:在实现这个目标时需要使用单例的时候,需要考虑线程安全问题,如果想简单,可直接使用饿汉式的模式实现,如果使用懒汉式可以查看这篇文章:
由于我这里都是在主线程生成,所以不涉及这个问题。
我在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);
}
}