編輯:關於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.javafinal 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 subscriberMethods = subscriberMethodFinder.findSubscriberMethods(subscriber.getClass(),methodName);
for (SubscriberMethod subscriberMethod : subscriberMethods) {
subscribe(subscriber, subscriberMethod, sticky, priority);
}
} 其中注冊函數register,默認參數DEFAULT_METHOD_NAME為函數名稱"onEvent",在java放射機制中,所有的事件處理函數名稱 統一為“onEvent”,僅僅參數不一致。onEvent的參數為用戶自定義的對象。private void subscribe(Object subscriber, SubscriberMethod subscriberMethod, boolean sticky, int priority)進行處理。
/** Finds all Class objects including super classes and interfaces. */
private List> 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;
}
} 其作用,就是把這個事件類的對象、實現的接口及父類的類對象存到一個List中返回,根據list中的eventTypes,遍歷subscriptionsByEventType,獲取訂閱源對象,進行逐一的調用事件函數。
Android RecyclerView實現下拉列表功能
現在市面上的很多的應用,都帶有下拉列表的功能,將所有選項都放在下拉列表中,當用戶點擊選擇的時候,彈出所有的選項,用戶選擇一項後,下拉列表自動隱藏,很多下拉列表都是用Lis
深入淺出再談Unity內存洩漏
WeTest導讀本文通過對內存洩漏(what)及其危害性(why)的介紹,引出在Unity環境下定位和修復內存洩漏的方法和工具(how)。最後提出了一些避免洩漏的方法與建
Android實現Banner界面廣告圖片循環輪播(包括實現手動滑動循環)
前言:經常會看到有一些app的banner界面可以實現循環播放多個廣告圖片和手動滑動循環。本以為單純的ViewPager就可以實現這些功能。但是蛋疼的事情來了
6.4、Android Studio的GPU Monitor
Android Monitor包含GPU Monitor,它將可視化的顯示渲染窗體的時間。GPU Monitor可以幫助你:1、 迅速查看UI窗體生成2、 辨別是否渲染管