Subject represents an object that is both an Observable and an Observer. It allows objects to subscribe to it as an Observable and also emit events to observers as an Observer. There are different types of Subjects including PublishSubject, BehaviorSubject, AsyncSubject, and ReplaySubject. PublishSubject simply publishes events to observers, BehaviorSubject caches the last emitted value, AsyncSubject only emits the last value upon completion, and ReplaySubject caches emitted values and replays them to new observers. Subjects can be used to build event buses to facilitate loose coupling between components.
4. /**
* Represents an object that is both an Observable and an Observer.
*/
public abstract class Subject<T, R> extends Observable<R> implements Observer<T> {
protected Subject(OnSubscribe<R> onSubscribe) {
super(onSubscribe);
}
...
}
5. /**
* Represents an object that is both an Observable and an Observer.
*/
public abstract class Subject<T, R> extends Observable<R> implements Observer<T> {
protected Subject(OnSubscribe<R> onSubscribe) {
super(onSubscribe);
}
...
}
56. public class RxEventBus {
private final Subject<Object, Object> bus
= new SerializedSubject<>(PublishSubject.create());
public void post(Object event) {
bus.onNext(event);
}
public <T> Subscription subscribe(Class<T> clazz, Action1<T> onNext) {
return bus.ofType(clazz).subscribe(onNext);
}
}
57. public class RxEventBus {
private final Subject<Object, Object> bus
= new SerializedSubject<>(PublishSubject.create());
public void post(Object event) {
bus.onNext(event);
}
public <T> Subscription subscribe(Class<T> clazz, Action1<T> onNext) {
return bus.ofType(clazz).subscribe(onNext);
}
}
Thread Safe Subject
58. public class RxEventBus {
private final Subject<Object, Object> bus
= new SerializedSubject<>(PublishSubject.create());
public void post(Object event) {
bus.onNext(event);
}
public <T> Subscription subscribe(Class<T> clazz, Action1<T> onNext) {
return bus.ofType(clazz).subscribe(onNext);
}
}
bypass
59. public class BusProvider {
private static final RxEventBus eventBus = new RxEventBus();
private BusProvider() {
}
public static RxEventBus getInstance() {
return eventBus;
}
}
Singleton
60. public class ItemSelectEvent {
private int position;
public ItemSelectEvent(int position) {
this.position = position;
}
public int getPosition() {
return position;
}
}
Simple Event
61. public class Adapter extends RecyclerView.Adapter<ViewHolder> {
private LayoutInflater layoutInflater;
private List<String> texts;
public Adapter(Context context) {
layoutInflater = LayoutInflater.from(context);
texts = new ArrayList<>();
texts.add("あああああああああああ");
...
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = layoutInflater.inflate(R.layout.list_item, parent, false);
ViewHolder viewHolder = new ViewHolder(v);
viewHolder.itemView.setOnClickListener(view -> {
int position = viewHolder.getAdapterPosition();
if (position != RecyclerView.NO_POSITION) {
BusProvider.getInstance().post(new ItemSelectEvent(position));
}
});
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.bind(texts.get(position));
}
@Override
public int getItemCount() {
return texts.size();
}
}
62. public class Adapter extends RecyclerView.Adapter<ViewHolder> {
private LayoutInflater layoutInflater;
private List<String> texts;
public Adapter(Context context) {
layoutInflater = LayoutInflater.from(context);
texts = new ArrayList<>();
texts.add("あああああああああああ");
...
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = layoutInflater.inflate(R.layout.list_item, parent, false);
ViewHolder viewHolder = new ViewHolder(v);
viewHolder.itemView.setOnClickListener(view -> {
int position = viewHolder.getAdapterPosition();
if (position != RecyclerView.NO_POSITION) {
BusProvider.getInstance().post(new ItemSelectEvent(position));
}
});
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.bind(texts.get(position));
}
@Override
public int getItemCount() {
return texts.size();
}
}
ottoとほぼ同じ!