Android源码之Observable

Observable是观察者模式的典型应用。在Android下,Observable是一个泛型的抽象类,表示一个观察者对象,提供了观察者注册、反注册及清空三个方法,其源码如下(很简单,所以将注释删除了):

public abstract class Observable<T> {

    protected final ArrayList<T> mObservers = new ArrayList<T>();

    public void registerObserver(T observer) {
        if (observer == null) {
            throw new IllegalArgumentException("The observer is null.");
        }
        synchronized(mObservers) {
            if (mObservers.contains(observer)) {
                throw new IllegalStateException("Observer " + observer + " is already registered.");
            }
            mObservers.add(observer);
        }
    }

    public void unregisterObserver(T observer) {
        if (observer == null) {
            throw new IllegalArgumentException("The observer is null.");
        }
        synchronized(mObservers) {
            int index = mObservers.indexOf(observer);
            if (index == -1) {
                throw new IllegalStateException("Observer " + observer + " was not registered.");
            }
            mObservers.remove(index);
        }
    }

    public void unregisterAll() {
        synchronized(mObservers) {
            mObservers.clear();
        }        
    }
}

通过Eclipse可看到,其直接继承者有两个:DataSetObservable和ContentObservable。ContentObservable实现比较复杂,不过功能与DataSetObservable类似,所以没仔细看,只研究了DataSetObservable。

DataSetObservable在很多的Adapter中都用到,像BaseAdapter。DataSetObservable使用DataSetObserver实例化了Observable。DataSetObserver表示了一个数据集对象的观察者,主要提供了两个方法:

public abstract class DataSetObserver {

    public void onChanged() {
        // Do nothing
    }

    public void onInvalidated() {
        // Do nothing
    }
}

DataSetObservable实现如下:

public class DataSetObservable extends Observable<DataSetObserver> {

    public void notifyChanged() {
        synchronized(mObservers) {
            for (DataSetObserver observer : mObservers) {
                observer.onChanged();
            }
        }
    }

    public void notifyInvalidated() {
        synchronized (mObservers) {
            for (DataSetObserver observer : mObservers) {
                observer.onInvalidated();
            }
        }
    }
}

当数据集有变化时,会调用DataSetObserver的onChanged()方法;当数据集失效时,会调用DataSetObserver的onINvalidated()方法。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作者bjzhou,源码Coolapk-kotlin,这是一款非常不错的应用商店项目案例,酷安应用商店开源版客户端应用项目源码。点此下载 Demo apk酷市场 V7 版 API 相关所有接口使用统一的前缀: https://api.coolapk.com/v6/所有接口使用统一的 HTTP 头:User-Agent: Dalvik/2.1.0 (Linux; U; Android 5.1.1; Nexus 4 Build/LMY48T) (#Build; google; Nexus 4; LMY48T; 5.1.1) +CoolMarket/7.3 X-Requested-With: XMLHttpRequest X-Sdk-Int: 22 X-Sdk-Locale: zh-CN X-App-Id: coolmarket X-App-Token: 2a6e2adc2897c8d8133db17c2cd3b1045834ce58-d7d5-38eb-95d5-563167a1983d0x588f16cd X-App-Version: 7.3 X-App-Code: 1701135 X-Api-Version: 7具体参数获取方式可参考ApiManager.java,其中X-App-Token的生成是c++写的,直接引用了酷市场的 so 文件,不清楚具体算法,组合方式应该是校验和+uuid+时间戳本项目介绍了 main/init 和 picture/list 两个接口的具体使用方法,分别是获取启动图和所有酷图的,其他接口可参考下面的 retrofit 接口文件:public interface CoolMarketService {        @POST("feed/favorite")        Observable<Result>> m3639A(@Query("id") String str);        @POST("user/follow")        Observable<Result>> m3640B(@Query("uid") String str);        @POST("user/unfollow")        Observable<Result>> m3641C(@Query("uid") String str);        @POST("feed/cancelRecommend")        Observable<Result>> m3642D(@Query("id") String str);        @POST("feed/Recommend")        Observable<Result>> m3643E(@Query("id") String str);        @POST("discovery/loadDiscoveryInfo")        Observable<Result>> m3644F(@Query("query") String str);        @GET("topic/tagDetail")        Observable<Result>> m3645G(@Query("tag") String str);        @GET("feed/followTag")        Observable<Result>> m3646H(@Query("tag") String str);        @GET("feed/unFollowTag")        Observable<Result>> m3647I(@Query("tag") String str);        @GET("message/receive")        Observable<Result>> m3648J(@Query("id") String str);        @GET("message/read")        Observable<Result>> m3649K(@Query("ukey") String str);        @GET("cloudInstall/task")        Observable<Result>> m3650L(@Query("id") String str);        @GET("apk/qr")        Observable<Result<Servi

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值