说明:本文的解析过程并不只是简单的讲解框架中各个方法的调用逻辑、程序的执行过程,而是依赖于示例代码,结合了具体的的示例程序的执行流程,有助于更好的理解。
有关Otto的使用方法参见另一篇文章: Android事件总线框架Otto使用介绍
package com.windfallsheng.myotto;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.squareup.otto.Subscribe;
public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
private Button mBtnJumpToPost, mBtnJumpToProduce, mBtnJumpToMainActivity;
private TextView mTvMessage, mTvMessageUpdate;
public static void start(Context context) {
context.startActivity(new Intent(context, MainActivity.class));
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTvMessage = (TextView) this.findViewById(R.id.tv_message);
mTvMessageUpdate = (TextView) this.findViewById(R.id.tv_message_update);
mBtnJumpToPost = (Button) this.findViewById(R.id.btn_jump_to_post);
mBtnJumpToMainActivity = (Button) this.findViewById(R.id.btn_jump_to_main_activity);
mBtnJumpToProduce = (Button) this.findViewById(R.id.btn_jump_to_produce);
mBtnJumpToPost.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PostActivity.start(MainActivity.this);
}
});
mBtnJumpToProduce.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ProduceActivity.start(MainActivity.this);
}
});
mBtnJumpToMainActivity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MainActivity.start(MainActivity.this);
}
});
Log.i(TAG, "method:onCreate#this#hashCode=" + this.hashCode());
OttoBus.getInstance().register(this);
}
@Subscribe
public void refreshMessage(EventData eventData) {
Log.i(TAG, "method:Subscribe#refreshMessage#eventData#hashCode=" + eventData.hashCode());
Log.i(TAG, "method:Subscribe#refreshMessage#eventData=" + eventData);
mTvMessage.setText(eventData.getUserName() + ":\n\n" + eventData.getMessage());
}
@Subscribe
public void updateMessage(EventData eventData) {
Log.i(TAG, "method:updateMessage#updateMessage#eventData#hashCode=" + eventData.hashCode());
Log.i(TAG, "method:Subscribe#updateMessage#eventData=" + eventData);
mTvMessageUpdate.setText(eventData.getUserName() + ":\n\n" + eventData.getMessage());
}
@Override
protected void onDestroy() {
super.onDestroy();
OttoBus.getInstance().unregister(this);
}
}
在MainActivity的onDestroy()方法中调用unregister()方法的执行过程:
注销方法中部分逻辑的处理流程可以参照注册方法的逻辑
public class Bus {
.......省略.......
private final ConcurrentMap<Class<?>, Set<Class<?>>> flattenHierarchyCache =
new ConcurrentHashMap<Class<?>, Set<Class<?>>>();
public void unregister(Object object) {
if (object == null) {
throw new NullPointerException("Object to unregister must not be null.");
}
enforcer.enforce(this);
// 查找当前对象中所有用@Produce注解的方法,和注册时的查找流程相同;
// 这里返回的集合大小是0;
Map<Class<?>, EventProducer> producersInListener = handlerFinder.findAllProducers(object);
for (Map.Entry<Class<?>, EventProducer> entry : producersInListener.entrySet()) {
final Class<?> key = entry.getKey();
EventProducer producer = getProducerForEventType(key);
EventProducer value = entry.getValue();
if (value == null || !value.equals(producer)) {
throw new IllegalArgumentException(
"Missing event producer for an annotated method. Is " + object.getClass()
+ " registered?");
}
producersByType.remove(key).invalidate();
}
// 查找当前对象中所有用@Subscribe注解的方法,和注册时的查找流程相同
Map<Class<?>, Set<EventHandler>> handlersInListener = handlerFinder.findAllSubscribers(object);
for (Map.Entry<Class<?>, Set<EventHandler>> entry : handlersInListener.entrySet()) {
Set<EventHandler> currentHandlers = getHandlersForEventType(entry.getKey());
Collection<EventHandler> eventMethodsInListener = entry.getValue();
if (currentHandlers == null || !currentHandlers.containsAll(eventMethodsInListener)) {
throw new IllegalArgumentException(
"Missing event handler for an annotated method. Is " + object.getClass()
+ " registered?");
}
// 循环遍历将监听对象的是否接收事件属性设置为false,即不再接收
for (EventHandler handler : currentHandlers) {
if (eventMethodsInListener.contains(handler)) {
handler.invalidate();
}
}
// 移除所有不再接收事件的监听对象
currentHandlers.removeAll(eventMethodsInListener);
}
}
.......省略.......
}
handlerFinder.findAllSubscribers(object) 最终调用的方法还是 AnnotatedHandlerFinder 类中的 findAllSubscribers() 方法:
final class AnnotatedHandlerFinder {
/** Cache event bus producer methods for each class. */
private static final ConcurrentMap<Class<?>, Map<Class<?>, Method>> PRODUCERS_CACHE =
new ConcurrentHashMap<Class<?>, Map<Class<?>, Method>>();
/** Cache event bus subscriber methods for each class. */
private static final ConcurrentMap<Class<?>, Map<Class<?>, Set<Method>>> SUBSCRIBERS_CACHE =
new ConcurrentHashMap<Class<?>, Map<Class<?>, Set<Method>>>();
.......省略..........
/** This implementation finds all methods marked with a {@link Produce} annotation. */
static Map<Class<?>, Set<EventHandler>> findAllSubscribers(Object listener) {
Class<?> listenerClass = listener.getClass();
Map<Class<?>, Set<EventHandler>> handlersInMethod = new HashMap<Class<?>, Set<EventHandler>>();
// 这个时候集合中已经有相应的值
Map<Class<?>, Set<Method>> methods = SUBSCRIBERS_CACHE.get(listenerClass);
if (null == methods) {
methods = new HashMap<Class<?>, Set<Method>>();
loadAnnotatedSubscriberMethods(listenerClass, methods);
}
if (!methods.isEmpty()) {
for (Map.Entry<Class<?>, Set<Method>> e : methods.entrySet()) {
Set<EventHandler> handlers = new HashSet<EventHandler>();
for (Method m : e.getValue()) {
handlers.add(new EventHandler(listener, m));
}
handlersInMethod.put(e.getKey(), handlers);
}
}
return handlersInMethod;
}
.......省略..........
}
public class Bus {
.......省略.......
// 从注册集合中查找
Set<EventHandler> getHandlersForEventType(Class<?> type) {
return handlersByType.get(type);
}
.......省略.......
}
由于作者水平有限,语言描述及代码实现中难免有纰漏,望各位看官多提宝贵意见!
Hello , World !
感谢所有!