編輯:關於Android編程
public abstract class AbsHTTPRequest { private final WeakHashMap具體的主題角色( 被觀察者),實現方式如下:mListeners = new WeakHashMap (); public interface OnChangedListener { void onDataChanged(); } /*HTTP's response*/ public abstract void onResponse(); public final void addListener(OnChangedListener listener) { mListeners.put(listener, true); } public final void removeListener(OnChangedListener listener) { mListeners.remove(listener); } protected final void notifyDataChanged() { Set keys = mListeners.keySet(); if(keys != null) { Iterator iterator = keys.iterator(); while(iterator.hasNext()) { iterator.next().onDataChanged(); } } } }
public class LoginRequest extends AbsHTTPRequest implements OnChangedListener{ public void onResponse(){ addListener(this); notifyDataChanged(); } @Override public void onDataChanged() { // TODO Auto-generated method stub System.out.println("LoginRequest"); } }使用觀察者模式有一個弊病就是部件之間的耦合度太高,所有的主題角色都需要實現同一個interface。觀察者模式定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。如果主題角色被注冊的observer越多,那麼需要實現的interface也就越多,接口方法數量也就越多。
SubscribMethod.java final class SubscriberMethod { final Method method; /*Method類型的method成員表示這個onEvent,即事件處理函數。同時也包含訂閱源*/ final ThreadMode threadMode; final Class> eventType; /*事件的對象,用戶自定義Object*/ ... ... ... ... ... ... ... ... ... ... ... ... }Subscription.java
final class Subscription { final Object subscriber; /*訂閱源Subscriber,即調用register注冊的對象*/ final SubscriberMethod subscriberMethod; /**/ final int priority; ... ... ... ... ... ... ... ... ... ... ... ... }類EventBus中,有兩個核心的成員
/*EventType -> List注冊流程:在調用register函數時,EventBus類有多個重載的register函數,但是作者更傾向於使用register(this);含有 多個參數的register函數中,明確標注了@deprecated,原創作者不建議使用。從代碼:,事件到訂閱對象之間的映射*/ private final Map , CopyOnWriteArrayList > subscriptionsByEventType; /* Subscriber -> List ,訂閱對象到它訂閱的的所有事件的映射關系*/ private final Map
public void register(Object subscriber) { register(subscriber, DEFAULT_METHOD_NAME, false, 0); }可以觀察到,所有重載的register函數,都調用到了
private synchronized void register(Object subscriber, String methodName, boolean sticky, int priority) { List其中注冊函數register,默認參數DEFAULT_METHOD_NAME為函數名稱"onEvent",在java放射機制中,所有的事件處理函數名稱 統一為“onEvent”,僅僅參數不一致。onEvent的參數為用戶自定義的對象。subscriberMethods = subscriberMethodFinder.findSubscriberMethods(subscriber.getClass(),methodName); for (SubscriberMethod subscriberMethod : subscriberMethods) { subscribe(subscriber, subscriberMethod, sticky, priority); } }
private void subscribe(Object subscriber, SubscriberMethod subscriberMethod, boolean sticky, int priority)進行處理。
/** Finds all Class objects including super classes and interfaces. */ private List其作用,就是把這個事件類的對象、實現的接口及父類的類對象存到一個List中返回,根據list中的eventTypes,遍歷subscriptionsByEventType,獲取訂閱源對象,進行逐一的調用事件函數。> findEventTypes(Class> eventClass) { synchronized (eventTypesCache) { List > eventTypes = eventTypesCache.get(eventClass); if (eventTypes == null) { eventTypes = new ArrayList >(); Class> clazz = eventClass; while (clazz != null) { eventTypes.add(clazz); addInterfaces(eventTypes, clazz.getInterfaces()); clazz = clazz.getSuperclass(); } eventTypesCache.put(eventClass, eventTypes); } return eventTypes; } }
現在市面上的很多的應用,都帶有下拉列表的功能,將所有選項都放在下拉列表中,當用戶點擊選擇的時候,彈出所有的選項,用戶選擇一項後,下拉列表自動隱藏,很多下拉列表都是用Lis
WeTest導讀本文通過對內存洩漏(what)及其危害性(why)的介紹,引出在Unity環境下定位和修復內存洩漏的方法和工具(how)。最後提出了一些避免洩漏的方法與建
前言:經常會看到有一些app的banner界面可以實現循環播放多個廣告圖片和手動滑動循環。本以為單純的ViewPager就可以實現這些功能。但是蛋疼的事情來了
Android Monitor包含GPU Monitor,它將可視化的顯示渲染窗體的時間。GPU Monitor可以幫助你:1、 迅速查看UI窗體生成2、 辨別是否渲染管