股票场内基金交易,没时间盯盘?

   
使用优财助手电脑客户端记录下您的股票买入卖出数据,能帮您时刻盯盘,会根据您记录的未售出买入价计算上涨或下跌幅度,及时弹框通知您。想知道如何使用?快点击左方视频观看了解吧~~下载地址:http://youcaizhushou.com

前言

上篇文章笔者简单介绍了 EventBus 的用法。本篇文章笔者将简单分析 EventBus 的源码。从上篇文章我们可以得知,要使用 EventBus 首先要调用 EventBus 的 register 方法注册(一般在 onCreate 方法中)。然后,定义被 Subscribe 注解的方法(用来接收由 post 方法发送的消息)。最后,调用 unregister 方法解注册(一般在 onDestroy 方法中)。所以,笔者注重分析 EventBus 的 register , post 方法的实现,以及 EventBus 是如何调用接收消息的方法的。

register

我们一般调用上述代码进行注册,调用上述代码的类我们暂且称为注册类。其中 getDefault 方法获取 EventBus 的实例。register 方法源码如下:

先来看 3 , 4 行:这里调用 subscriberMethodFinder.findSubscriberMethods(subscriberClass) 得到一个 SubscriberMethod 的 List 。其中 SubscriberMethod 是对注册类中接收消息的方法的 Method 对象的封装。subscriberMethodFinder 是 SubscriberMethodFinder 类型的,我们接着追踪 SubscriberMethodFinder 的 findSubscriberMethods 方法。

第 2 行:List<SubscriberMethod> subscriberMethods = METHOD_CACHE.get(subscriberClass); 其中 METHOD_CACHE 是 Map<class, List> 类型的,其实 METHOD_CACHE 是存储注册类中接收消息的方法的 Map ,METHOD_CACHE 的 key 是 注册类的 Class,value 是注册类中接收消息的方法的 Method 对象的封装类的 List。如果是第一次注册 subscriberMethods 应该是 null ,第 7 行中的 ignoreGeneratedIndex 为 false。此时,将执行第 10 行 subscriberMethods = findUsingInfo(subscriberClass); 在 findUsingInfo 方法中将调用 findUsingReflectionInSingleClass 方法,源码如下: </class

由上述代码可以看出,findUsingReflectionInSingleClass 获取注册类中定义的方法并且遍历这些方法,然后把 public 、非 static 、非 abstract 、非 synthetic 、一个参数的、并且被注解 Subscribe 标注的方法封装成 SubscriberMethod 对象。并添加到 List subscriberMethods 中。然后把 subscriberMethods 返回给 findUsingInfo 方法,并最终返回给 EventBus 的 register 方法。接下来我们重新回到 register 方法。
register 方法中第 6 7 8 行 对返回的 List subscriberMethods 的遍历并调用 subscribe 方法。subscribe 方法的源码如下:

在 subscribe 方法中,把
subscriberMethod 和注册类对象封装成 Subscription 对象 newSubscription 。 并将 newSubscription 添加到 CopyOnWriteArrayList subscriptions 中并且通过 subscriberMethod.priority 确定 newSubscription 在 subscriptions 中的位置。subscriberMethod.priority 其实就是方法执行的优先级。需要注意的是,subscriptions 会被保存到 subscriptionsByEventType 中,subscriptionsByEventType 是一个 Map ,其 key 是注册类中被注解的方法的参数的类型,也就是接受消息的方法的参数的类型。 至此 register 方法大概介绍完毕。下面来看 post 方法。

post

EventBus 的 post 方法 是 EventBus 用来发布消息的方法。 post 方法被调用后会将 post 方法的参数传递给相应的注册类中的相应的方法中,并调用此方法。这个过程是怎样的呢?请看 post 的源码:

由上述源码可以看出,第 4 , 5 行把 post 方法的参数添加到一个 List 中。第 8 行得到 post 方法是否是在 mian 线程中调用的。第 14 15 16 行对保存 post 方法参数的 List 遍历删除并调用 postSingleEvent 方法。在 postSingleEvent 方法中会调用 postSingleEventForEventType 方法。postSingleEventForEventType 方法的源码如下:

}

在 postSingleEventForEventType 方法中通过参数的类型获取 subscriptionsByEventType 中相应的 Subscription 的 CopyOnWriteArrayList subscriptions。如果 subscriptions 不为空则遍历它,并调用 postToSubscription 。postToSubscription 的源码如下:

由上述代码可以看出,postToSubscription 通过注解 Subscription 的属性 threadMode 的值,决定相应的接受信息的方法在哪个线程里调用。调用的规则已经在上篇文章中阐述过,这里不再赘述。invokeSubscriber 方法其实就是利用反射来实现接受信息的方法的调用的,这里也不再详细说明。

总结

EventBus 的实现其实就是一个典型的观察者模式。注册类向 EventBus 注册,当有消息需要发送的时候 EventBus 通过 post 方法向注册者们分发消息,其实就是遍历调用注册类中符合要求的方法。

   

想获得去掉 5 元限制的证券账户吗?

证券交易股票基金的佣金,不足 5 元会按照 5 元收取。比如交易 1000 元的股票,按照普遍的证券佣金手续费率万 2.5,其交易佣金为 0.25 元,小于 5 元,实际会收取佣金 5 元,买卖两次需要支付 10 元佣金成本,1% 的利润就这样没了。

如果您想去掉最低交易佣金 5 元限制,使用微信扫描左边小程序二维码,访问微信小程序「优财助手」,点击底部菜单「福利」,阅读文章「通过优财开证券账户无最低交易佣金 5 元限制」,按照文章步骤操作即可获得免 5 元证券账户,股票基金交易手续费率万 2.5。

请注意,一定要按照文章描述严格操作,如错误开户是无法获得免 5 元证券账户的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注