几种网络框架的比较
1、volley
一个简单的http异步请求库,但不支持同步,不能post大数据(上传文件时有问题);
2、android-async-http
和volley一样,是异步的请求库,只不过volley使用的是httpUrlConnection,而它使用的是HttpClient。这个库已经不再适合Android;
3、okhttp
基于httpUrlConnection,支持同步和异步,但需要自己再封装下;
4、retrofit;
对 okhttp再次封装,在项目中可以直接使用。
这里主要介绍使用okhttp+retrofit
调用的步骤
1、引入Git上的项目
compile ‘com.squareup.retrofit2:retrofit:2.0.2’(需要在GitHub上定位到最新的版本),Rebuild项目。
2、在项目中引用retrofit,分为几个部分
- module对象 - Converter的实现类 - Service类(定义网址中不固定的部分) - OkHttpClient和Retrofit
module对象(Bean)
public class ScreenBean {
public final String mTitle;
public final String mSize;
public ScreenBean(String title,String size){
mTitle = title;
mSize = size;
}
}
ScreenConvert
public class ScreenConvert implements Converter<ResponseBody,ScreenBean>{
static final ScreenConvert.Factory FACTOYR = new ScreenConvert.Factory(){
@Override
public Converter<ResponseBody, ?> responseBodyConverter(
Type type, Annotation[] annotations, Retrofit retrofit) {
if(type == ScreenBean.class)return new ScreenConvert();
else return null;
}
};
@Override
public ScreenBean convert(ResponseBody value) throws IOException {
//values.string 把服务器上请求的数据,转换成string格式
return ...;
}
}
PageService
public interface PageService{
@GET("GetHotDownload.xml")
Call<ScreenBean> get(@Query("pageNum") String pageNum1,
@Query("packNumForOnePage") String packNumForOnePage,
@Query("userId") String userId,@Query("codeVersion") String version,
@Query("classId") String classId);
}
加载部分
Dispatcher dispatcher = new Dispatcher(Executors.newFixedThreadPool(20));//线程池
dispatcher.setMaxRequests(20);//最大的请求数量
dispatcher.setMaxRequestsPerHost(1);//主机同一个时间,最大的请求数量
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.dispatcher(dispatcher)
.connectionPool(new ConnectionPool(100,30, TimeUnit.SECONDS))
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(mUrl)
.addConverterFactory(ScreenConvert.FACTOYR)
.client(okHttpClient)
.build();
PageService pageService = retrofit.create(PageService.class);
pageService.get("1","12","0","14","0").enqueue(new Callback<ScreenBean>() {
@Override
public void onResponse(Call<ScreenBean> call, Response<ScreenBean> response) {
if(response.isSuccessful()){
Log.i(TAG, "onResponse: 成功");
}else{
Log.i(TAG, "onResponse: 失败");
}
}
@Override
public void onFailure(Call<ScreenBean> call, Throwable t) {
Log.i(TAG, "onFailure: 失败"+t.toString());
}
});
注意:把上面的网址替换掉,换成自己的网址
到这一步,已经可以实现基于Retrofit+OkHttp,实现和网络数据的交互。但在实际的运用中,还会设计更加复杂的情况,比如Cookie的缓存,添加头部等,下一个章节再具体谈论。
参考文档
volley的介绍:http://bxbxbai.github.io/2014/09/14/android-working-with-volley/
时间: 2024-10-11 00:49:18