Retrofit网络框架搭建

本项目采用MVP+RxJava+Retrofit架构,整合5.0系统新特性,利用RecyclerView实现新闻应用。文章详细介绍了网络请求类及Retrofit结合RxJava的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目地址https://github.com/helloworld107/ZhNews
本项目运用了很多新鲜前沿的技术,mvp+rxjava+retrofit+5.0系统新特性布局,recycerview,项目结构不算复杂,对于学习新技术的朋友有很好的教学意义,下面开始撸代码,分析一下该项目的核心知识点部分
先看框架
大体上工具类,自定义控件,适配器,bean实体类与mvc并没有任何不同,由于使用的mvp+rxjava+retrofit,差异的地方在于api获取方式,和presenter,view接口,咱们先从简单的来,看看网络请求的类
这是栏目其中的一个api,如果按照retrofit的方式返回的应该是一个
Call<ResponseBody>.由于结合rxjava,所以返回一个被观察者对象observable,具体对应的实体类都是json解析很简单这里不多说,
通过这种写法就可以通过rxjava的方法调用了。

public interface DailyApi {

@GET("homes/index/{num}.json")
Observable<DailyTimeLine> getDailyTimeLine(@Path("num") String num);

@GET("options/index/{id}/{num}.json")
Observable<DailyTimeLine> getDailyFeedDetail(@Path("id") String id, @Path("num") String num);
}

之后写一个返回对应retrofit的类
public class ApiRetrofit {

// 三个基本网址
public static final String ZHIHU_BASE_URL = "http://news-at.zhihu.com/api/4/" ;
public static final String GANK_BASE_URL = "http://gank.io/api/" ;
public static final String DAILY_BASE_URL = "http://app3.qdaily.com/app3/" ;
// 三个访问类
public ZhihuApi ZhihuApiService ;
public GankApi GankApiService ;
public DailyApi DailyApiService ;

public ZhihuApi getZhihuApiService() {
return ZhihuApiService ;
}

public GankApi getGankApiService() {
return GankApiService ;
}

public DailyApi getDailyApiService() {
return DailyApiService ;
}

// 饿汉模式,构造方法的时候就把类都创建好了
ApiRetrofit() {
// 搞一个自己的缓存
File httpCacheDirectory = new File(MyApp. mContext .getCacheDir(), "responses" );
int cacheSize = 10 * 1024 * 1024 ; // 10 MiB
Cache cache = new Cache(httpCacheDirectory,cacheSize);

OkHttpClient client= new OkHttpClient.Builder().addInterceptor( REWRITE_CACHE_CONTROL_INTERCEPTOR ).
//这里有个拦截器,用来监测访问数据的信息以及更改一些参数,这里不是重点代码略过
cache(cache).build();

Retrofit retrofit_zhihu = new Retrofit.Builder()
.baseUrl( ZHIHU_BASE_URL )
.client(client)
.addConverterFactory(GsonConverterFactory. create ())
.addCallAdapterFactory( RxJavaCallAdapterFactory . create ()) 结合rxjava的必要写法
.build();

Retrofit retrofit_gank = new Retrofit.Builder()
.baseUrl( GANK_BASE_URL )
.client(client)
.addConverterFactory(GsonConverterFactory. create ())
.addCallAdapterFactory(RxJavaCallAdapterFactory. create ())
.build();

Retrofit retrofit_daily= new Retrofit.Builder()
.baseUrl( DAILY_BASE_URL )
.client(client)
.addConverterFactory(GsonConverterFactory. create ())
.addCallAdapterFactory(RxJavaCallAdapterFactory. create ())
.build();

ZhihuApiService =retrofit_zhihu.create(ZhihuApi. class );
GankApiService =retrofit_gank.create(GankApi. class );
DailyApiService =retrofit_daily.create(DailyApi. class );


}
这样一来就可以在开发中调用了,不过作者又优化了一下,写了一个工厂类实习单例,同步锁
public class ApiFactory {

// 新的单例模式写法,靠一个静态类来位置单例
protected static final Object monitor = new Object();
static ZhihuApi zhihuApiSingleton = null ;
static GankApi gankApiSingleton = null ;
static DailyApi dailyApiSingleton = null ;
//return Singleton
//return Singleton
public static ZhihuApi getZhihuApiSingleton() {
synchronized ( monitor ) {
if ( zhihuApiSingleton == null ) {
zhihuApiSingleton = new ApiRetrofit().getZhihuApiService();
}
return zhihuApiSingleton ;
}
}

public static GankApi getGankApiSingleton() {
synchronized ( monitor ) {
if ( gankApiSingleton == null ) {
gankApiSingleton = new ApiRetrofit().getGankApiService();
}
return gankApiSingleton ;
}
}

public static DailyApi getDailyApiSingleton() {
synchronized ( monitor ) {
if ( dailyApiSingleton == null ) {
dailyApiSingleton = new ApiRetrofit().getDailyApiService();
}
return dailyApiSingleton ;
}
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值