使用RxJava+Retrofit+MVP+Glide开发一个简单的新闻客户端

Posted this.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用RxJava+Retrofit+MVP+Glide开发一个简单的新闻客户端相关的知识,希望对你有一定的参考价值。

好久没有更新博客了,有点懒。。之前在网上看到很多有趣又高效的开源库,于是就想着写一个简单的项目来运用这些开源库,恰巧看见聚合数据上有个新闻头条的API,所以就尝试写了一下。先上效果图:

在这个小项目中,使用RxJava和Retrofit网络请求框架来实现异步数据的获取是比较重要的环节。
关于RxJava和Retrofit的使用可以参考:http://gank.io/post/56e80c2c677659311bed9841

首先,需要封装好网络请求逻辑:

public class Api 
    private Retrofit retrofit;
    private static ApiService apiService;

    private Api() 
        OkHttpClient client = new OkHttpClient.Builder()
                .connectTimeout(10, TimeUnit.SECONDS)
                .build();
        retrofit = new Retrofit.Builder()
                .baseUrl(AppConfig.baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                //添加Rx适配
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .client(client)
                .build();
        apiService = retrofit.create(ApiService.class);
    

    public static ApiService getDefault() 
        if (apiService == null) 
            synchronized (Api.class) 
                if (apiService == null) 
                    new Api();
                
            
        
        return Api.apiService;
    


public interface ApiService 
    //获取新闻请求,返回Observable对象
    @GET("index")
    Observable<News> getNews(@Query("type") String type, @Query("key") String apiKey);

网络请求封装好了,由于整体采用了MVP架构,所以在Model层需要异步请求数据:

public class NewsModel implements NewsContract.Model 
    @Override
    public Observable<List<Data>> getChannelList(String type) 
        return Api.getDefault()
                .getNews(type, AppConfig.apiKey)
                .map(news -> news.getResult().getData())
                .compose(RxSchedulers.io_main()); //对Observable进行转换,用于切换执行异步任务的线程
    

整个项目设计中也同时实现了简单的事件总线RxBus,用于发送用户定义的Event:

public class RxBus 
    private static RxBus rxBus;

    private RxBus() 

    

    public static RxBus getInstance() 
        if (rxBus == null) 
            synchronized (RxBus.class) 
                if (rxBus == null) 
                    rxBus = new RxBus();
                
            
        
        return rxBus;
    

    public final Subject<Object, Object> _bus = new SerializedSubject<>(PublishSubject.create());

    public final Vector<Subscription> subscriptions = new Vector<>();

    //发送事件
    public void send(Object o) 
        _bus.onNext(o);
    

    //取出事件
    public Observable<Object> toObserverable() 
        return _bus;
    

    //添加订阅
    public void addSubscription(Subscription s) 
        subscriptions.add(s);
    

    //取消所有的订阅
    public void unSubscribeAll() 
        for (Subscription s : subscriptions) 
            if (!s.isUnsubscribed()) 
                s.unsubscribe();
            
        
    

更多细节也可以参考:http://git.oschina.net/QiHuangQi/News

以上是关于使用RxJava+Retrofit+MVP+Glide开发一个简单的新闻客户端的主要内容,如果未能解决你的问题,请参考以下文章

RxJava+Retrofit+OkHttp深入浅出-mvp(使用篇)

一款使用RxJava+Retrofit+MVP的快播App开源啦!

RxJava2+Retrofit2+RxLifecycle2使用MVP模式构建项目

开发 Material Design+RxJava+Retrofit+MVP App 参考资料

Android 教你一步步搭建MVP+Retrofit+RxJava网络请求框架

Android-MVP+Retrofit+Rxjava实现一个知乎日报客户端