Slide 1

Slide 1 text

Watcher EventBus Reinvented ayangxu

Slide 2

Slide 2 text

EventBus ฎՋԍ • ݎ૲-ᦈᴅཛྷࣳҁPublish - Subscribe҂ • guava/EventBus • greenrobot/EventBus • square/otto • moai/Watcher

Slide 3

Slide 3 text

// Class is typically registered by the container. class EventBusChangeRecorder { @Subscribe public void recordCustomerChange(ChangeEvent e) { recordChange(e.getChange()); } } // somewhere during initialisation eventBus.register(new EventBusChangeRecorder()); // much later public void changeCustomer() { ChangeEvent event = getChangeEvent(); eventBus.post(event); } guava/EventBus

Slide 4

Slide 4 text

// Class is typically registered by the container. class EventBusChangeRecorder { @Subscribe public void recordCustomerChange(ChangeEvent e) { recordChange(e.getChange()); } } // somewhere during initialisation eventBus.register(new EventBusChangeRecorder()); // much later public void changeCustomer() { ChangeEvent event = getChangeEvent(); eventBus.post(event); } guava/EventBus // Class is typically registered by the container. class EventBusChangeRecorder { @Subscribe public void recordCustomerChange(ChangeEvent e) { recordChange(e.getChange()); } } // somewhere during initialisation eventBus.register(new EventBusChangeRecorder()); // much later public void changeCustomer() { ChangeEvent event = getChangeEvent(); eventBus.post(event); }

Slide 5

Slide 5 text

// Define events: public class MessageEvent { /* Additional fields if needed */ } // Prepare subscribers: eventBus.register(this); public void onEvent(AnyEventType event) { /* Do something */ }; // Post events: eventBus.post(event); greenrobot/EventBus

Slide 6

Slide 6 text

// Define events: public class MessageEvent { /* Additional fields if needed */ } // Prepare subscribers: eventBus.register(this); public void onEvent(AnyEventType event) { /* Do something */ }; // Post events: eventBus.post(event); greenrobot/EventBus // Define events: public class MessageEvent { /* Additional fields if needed */ } // Prepare subscribers: eventBus.register(this); public void onEvent(AnyEventType event) { /* Do something */ }; // Post events: eventBus.post(event);

Slide 7

Slide 7 text

Bus bus = new Bus(); bus.post(new AnswerAvailableEvent(42)); @Subscribe public void answerAvailable(AnswerAvailableEvent event) { // TODO: React to the event somehow! } bus.register(this); @Produce public AnswerAvailableEvent produceAnswer() { // Assuming 'lastAnswer' exists. return new AnswerAvailableEvent(this.lastAnswer); } square/otto

Slide 8

Slide 8 text

Bus bus = new Bus(); bus.post(new AnswerAvailableEvent(42)); @Subscribe public void answerAvailable(AnswerAvailableEvent event) { // TODO: React to the event somehow! } bus.register(this); @Produce public AnswerAvailableEvent produceAnswer() { // Assuming 'lastAnswer' exists. return new AnswerAvailableEvent(this.lastAnswer); } square/otto Bus bus = new Bus(); bus.post(new AnswerAvailableEvent(42)); @Subscribe public void answerAvailable(AnswerAvailableEvent event) { // TODO: React to the event somehow! } bus.register(this); @Produce public AnswerAvailableEvent produceAnswer() { // Assuming 'lastAnswer' exists. return new AnswerAvailableEvent(this.lastAnswer); }

Slide 9

Slide 9 text

// Define an Event public interface PushWatcher extents Watchers.Watcher { void notify(Message message); } // Publishing an Event Watchers.of(PushWatcher.class).notify(message); // Subscribing to an Event public class MyFragment extends Fragment implement PushWatcher { public void notify(Message message) { } public void onStart() { Watchers.bind(this); } } Watcher

Slide 10

Slide 10 text

// Define an Event public interface PushWatcher extents Watchers.Watcher { void notify(Message message); } // Publishing an Event Watchers.of(PushWatcher.class).notify(message); // Subscribing to an Event public class MyFragment extends Fragment implement PushWatcher { public void notify(Message message) { } public void onStart() { Watchers.bind(this); } } Watcher // Define an Event public interface PushWatcher extents Watchers.Watcher { void notify(Message message); } // Publishing an Event Watchers.of(PushWatcher.class).notify(message); // Subscribing to an Event public class MyFragment extends Fragment implement PushWatcher { public void notify(Message message) { } public void onStart() { Watchers.bind(this); } }

Slide 11

Slide 11 text

guava EventBus greenrobot EventBus sqaure otto moai Watcher ᕚᑕਞق ✓ ✓ ✓ ✓ ٖਂਞق ✓ ✓ ✗ ҁಋۖᥴᕬ҂ ✓ ᔄࣳਞق ✗ ✗ ✗ ✓ դᎱᰁҁဳ᯽҂ 322ᤈ ׁᩢ Guava ෫ ෫ RxJava/Guava Ԫկ݇හ੗ᤰ ᵱᥝ ᵱᥝ ᵱᥝ ӧᵱᥝ ັತݎ૲/ᦈᴅ ✗ ✗ ✗ ✓ Ԫկ٫ᑱ ✗ ✗ ✗ ✓ Ԫկᖀಥ ✓ ✗ ✓ ✓ ᯿຅ඪ೮ ✗ ✗ ✗ ✓ ग़ොᦈᴅ ✓ ✗ ✓ ✓ ᕚᑕᯈᗝ ොဩᕆ ොဩᕆ Bus & ොဩᕆ ᔄᕆ ളත෯ၾ௳ ✗ ✗ ✗ ✓ ࢧ᧣᷇ሲᴴګ ✗ ✗ ✗ ✓

Slide 12

Slide 12 text

ਫሿᕡᜓ

Slide 13

Slide 13 text

Watchers.of(PushWatcher.class).notify(message); ᧣አ঩ಓ

Slide 14

Slide 14 text

Watchers.of(PushWatcher.class).notify(message); ᧣አ঩ಓ Watchers.of(PushWatcher.class).notify(message);

Slide 15

Slide 15 text

᧣አ঩ಓ Watchers.of(PushWatcher.class).notify(message); EventBus

Slide 16

Slide 16 text

᧣አ঩ಓ Watchers.of(PushWatcher.class).notify(message); EventBus Ԫկᔄڦ

Slide 17

Slide 17 text

᧣አ঩ಓ Watchers.of(PushWatcher.class).notify(message); EventBus Ԫկᔄڦ Ԫկ֢ۖ

Slide 18

Slide 18 text

᧣አ঩ಓ Watchers.of(PushWatcher.class).notify(message); EventBus Ԫկᔄڦ Ԫկ֢ۖ ֢ۖӤӥ෈

Slide 19

Slide 19 text

Proxy.newProxyInstance( clazz.getClassLoader(), new Class[] { clazz }, new WatcherHandler(clazz) ) ᧣አ঩ಓ

Slide 20

Slide 20 text

Proxy.newProxyInstance( clazz.getClassLoader(), new Class[] { clazz }, new WatcherHandler(clazz) ) ᧣አ঩ಓ Proxy.newProxyInstance( clazz.getClassLoader(), new Class[] { clazz }, new WatcherHandler(clazz) )

Slide 21

Slide 21 text

WatcherHandler static class WatcherHandler implements InvocationHandler {
 private final Class clazz;
 WatcherHandler(Class clazz) {
 this.clazz = clazz;
 }
 
 @Override
 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
 if (method.getDeclaringClass() == Object.class) {
 return method.invoke(this, args);
 }
 instance.trigger(clazz, method, args);
 return null;
 }
 }

Slide 22

Slide 22 text

WatcherHandler static class WatcherHandler implements InvocationHandler {
 private final Class clazz;
 WatcherHandler(Class clazz) {
 this.clazz = clazz;
 }
 
 @Override
 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
 if (method.getDeclaringClass() == Object.class) {
 return method.invoke(this, args);
 }
 instance.trigger(clazz, method, args);
 return null;
 }
 } static class WatcherHandler implements InvocationHandler {
 private final Class clazz;
 WatcherHandler(Class clazz) {
 this.clazz = clazz;
 }
 
 @Override
 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
 if (method.getDeclaringClass() == Object.class) {
 return method.invoke(this, args);
 }
 instance.trigger(clazz, method, args);
 return null;
 }
 } EventBus

Slide 23

Slide 23 text

WatcherHandler static class WatcherHandler implements InvocationHandler {
 private final Class clazz;
 WatcherHandler(Class clazz) {
 this.clazz = clazz;
 }
 
 @Override
 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
 if (method.getDeclaringClass() == Object.class) {
 return method.invoke(this, args);
 }
 instance.trigger(clazz, method, args);
 return null;
 }
 } static class WatcherHandler implements InvocationHandler {
 private final Class clazz;
 WatcherHandler(Class clazz) {
 this.clazz = clazz;
 }
 
 @Override
 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
 if (method.getDeclaringClass() == Object.class) {
 return method.invoke(this, args);
 }
 instance.trigger(clazz, method, args);
 return null;
 }
 } EventBus Ԫկᔄڦ

Slide 24

Slide 24 text

WatcherHandler static class WatcherHandler implements InvocationHandler {
 private final Class clazz;
 WatcherHandler(Class clazz) {
 this.clazz = clazz;
 }
 
 @Override
 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
 if (method.getDeclaringClass() == Object.class) {
 return method.invoke(this, args);
 }
 instance.trigger(clazz, method, args);
 return null;
 }
 } static class WatcherHandler implements InvocationHandler {
 private final Class clazz;
 WatcherHandler(Class clazz) {
 this.clazz = clazz;
 }
 
 @Override
 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
 if (method.getDeclaringClass() == Object.class) {
 return method.invoke(this, args);
 }
 instance.trigger(clazz, method, args);
 return null;
 }
 } EventBus Ԫկᔄڦ Ԫկ֢ۖ

Slide 25

Slide 25 text

WatcherHandler static class WatcherHandler implements InvocationHandler {
 private final Class clazz;
 WatcherHandler(Class clazz) {
 this.clazz = clazz;
 }
 
 @Override
 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
 if (method.getDeclaringClass() == Object.class) {
 return method.invoke(this, args);
 }
 instance.trigger(clazz, method, args);
 return null;
 }
 } static class WatcherHandler implements InvocationHandler {
 private final Class clazz;
 WatcherHandler(Class clazz) {
 this.clazz = clazz;
 }
 
 @Override
 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
 if (method.getDeclaringClass() == Object.class) {
 return method.invoke(this, args);
 }
 instance.trigger(clazz, method, args);
 return null;
 }
 } EventBus Ԫկᔄڦ Ԫկ֢ۖ ֢ۖӤӥ෈

Slide 26

Slide 26 text

// Define an Event public interface PushWatcher extents Watchers.Watcher { void notify(Message message); } // Publishing an Event Watchers.of(PushWatcher.class).notify(message); // Subscribing to an Event public class MyFragment extends Fragment implement PushWatcher { public void notify(Message message) { } public void onStart() { Watchers.bind(this); } } ᔄࣳਞق & ᯿຅

Slide 27

Slide 27 text

// Define an Event public interface PushWatcher extents Watchers.Watcher { void notify(Message message); } // Publishing an Event Watchers.of(PushWatcher.class).notify(message); // Subscribing to an Event public class MyFragment extends Fragment implement PushWatcher { public void notify(Message message) { } public void onStart() { Watchers.bind(this); } } ᔄࣳਞق & ᯿຅ // Define an Event public interface PushWatcher extents Watchers.Watcher { void notify(Message message); } // Publishing an Event Watchers.of(PushWatcher.class).notify(message); // Subscribing to an Event public class MyFragment extends Fragment implement PushWatcher { public void notify(Message message) { } public void onStart() { Watchers.bind(this); } }

Slide 28

Slide 28 text

Ԫկᖀಥ PushWatcher UpdateWatcher WeReadFragment

Slide 29

Slide 29 text

ᦈᴅग़ӻፓຽ PushWatcher NetworkChanged WeReadFragment

Slide 30

Slide 30 text

ັತ᧣አ & ᦈᴅ

Slide 31

Slide 31 text

ັತ᧣አ & ᦈᴅ

Slide 32

Slide 32 text

ᕚᑕᯈᗝ Watchers.bind( this, WRSchedulers.context(this) );

Slide 33

Slide 33 text

ᕚᑕᯈᗝ Watchers.bind( this, WRSchedulers.context(this) ); Watchers.bind( this, WRSchedulers.context(this) );

Slide 34

Slide 34 text

ളත෯ၾ௳ ᦈᴅ ݎ૲

Slide 35

Slide 35 text

ളත෯ၾ௳ 1 ᦈᴅ ݎ૲

Slide 36

Slide 36 text

ളත෯ၾ௳ 1 ᦈᴅ ݎ૲ ἕᦊᤈԅ

Slide 37

Slide 37 text

ളත෯ၾ௳ 2 1 ᦈᴅ ݎ૲ ἕᦊᤈԅ

Slide 38

Slide 38 text

ളත෯ၾ௳ 2 1 ᦈᴅ ݎ૲ ἕᦊᤈԅ 2

Slide 39

Slide 39 text

ളත෯ၾ௳ 2 1 ᦈᴅ ݎ૲ ἕᦊᤈԅ 2 ๋ᬪӞེ

Slide 40

Slide 40 text

ളත෯ၾ௳ 2 1 ᦈᴅ ݎ૲ ἕᦊᤈԅ 2 ๋ᬪӞེ 2

Slide 41

Slide 41 text

ളත෯ၾ௳ 2 1 ᦈᴅ ݎ૲ ἕᦊᤈԅ 2 ๋ᬪӞེ 2 զڹಅํ

Slide 42

Slide 42 text

ളත෯ၾ௳ 2 1 ᦈᴅ ݎ૲ ἕᦊᤈԅ 2 ๋ᬪӞེ 2 զڹಅํ 2 1

Slide 43

Slide 43 text

ളත෯ၾ௳ 2 1 ᦈᴅ ݎ૲ ἕᦊᤈԅ 2 ๋ᬪӞེ 2 զڹಅํ 2 1 3

Slide 44

Slide 44 text

ളත෯ၾ௳ 2 1 ᦈᴅ ݎ૲ ἕᦊᤈԅ 2 ๋ᬪӞེ 2 զڹಅํ 2 1 3 3 3 3

Slide 45

Slide 45 text

᷇ሲᴴګ

Slide 46

Slide 46 text

No content

Slide 47

Slide 47 text

ӥ᫹

Slide 48

Slide 48 text

ӥ᫹ 50ms 50ms 50ms

Slide 49

Slide 49 text

ӥ᫹ 50ms 50ms 50ms 50msࢧ᧣ Ԇᕚᑕᔺ஬෸ಲ୒

Slide 50

Slide 50 text

᷇ሲᴴګ @Watchers.Config(
 sample = 50,
 backpressureDrop = true,
 subject = Watchers.Subjects.BEHAVIOR
 )
 public interface LoadingWatcher extends Watchers.Watcher {
 void chapterProgress(LoadingProgress progress);
 }

Slide 51

Slide 51 text

᷇ሲᴴګ @Watchers.Config(
 sample = 50,
 backpressureDrop = true,
 subject = Watchers.Subjects.BEHAVIOR
 )
 public interface LoadingWatcher extends Watchers.Watcher {
 void chapterProgress(LoadingProgress progress);
 } @Watchers.Config(
 sample = 50,
 backpressureDrop = true,
 subject = Watchers.Subjects.BEHAVIOR
 )
 public interface LoadingWatcher extends Watchers.Watcher {
 void chapterProgress(LoadingProgress progress);
 }

Slide 52

Slide 52 text

ᨀᨀ Q & A