通过使用Retrofit+RxJavaVolley获取知乎日报消息,比较两者的使用区别。

文中 RR:代指Retrofit+Rxjava

主要两个方面使用

  1. 使用两者获取Json数据,使用Gson解析。
  2. 使用两者获取网络图片

1.第一步添加RR和Volley的gradle依赖

//google's volley
compile 'com.mcxiaoke.volley:library:1.0.19'
//RxAndroid
compile 'io.reactivex:rxandroid:1.2.1'
//RxJava
compile 'io.reactivex:rxjava:1.2.3'
//Retrofit
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'

2.分析知乎首页Api返回的Json格式

Api: http://news-at.zhihu.com/api/4/news/latest

3.构建bean

在AndroidStudio里我是使用一个Json2Pojo插件,可以直接将Json对象转换为适合Gson的JavaBean

在AS的插件管理里可以直接安装 Json2Pojo

 /**
* 知乎当日消息
*/
public class Stories {
//供 Google Analytics 使用
@SerializedName("ga_prefix")
private String mGaPrefix;
//url 与 share_url 中最后的数字(应为内容的 id)
@SerializedName("id")
private Long mId;
//图像地址(官方 API 使用数组形式。目前暂未有使用多张图片的情形出现,曾见无 images 属性的情况,请在使用中注意 )
@SerializedName("images")
private List<String> mImages;
//消息是否包含多张图片(仅出现在包含多图的新闻中)
@SerializedName("multipic")
private Boolean mMultipic;
//消息标题
@SerializedName("title")
private String mTitle;
//作用未知
@SerializedName("type")
private Long mType; public Stories(String mGaPrefix, Long mId, List<String> mImages, Boolean mMultipic, String mTitle, Long mType) {
this.mGaPrefix = mGaPrefix;
this.mId = mId;
this.mImages = mImages;
this.mMultipic = mMultipic;
this.mTitle = mTitle;
this.mType = mType;
} public void setGaPrefix(String mGaPrefix) {
this.mGaPrefix = mGaPrefix;
} public void setId(Long mId) {
this.mId = mId;
} public void setImages(List<String> mImages) {
this.mImages = mImages;
} public void setMultipic(Boolean mMultipic) {
this.mMultipic = mMultipic;
} public void setTitle(String mTitle) {
this.mTitle = mTitle;
} public void setType(Long mType) {
this.mType = mType;
} public String getGaPrefix() {
return mGaPrefix;
} public Long getId() {
return mId;
} public List<String> getImages() {
return mImages;
} public Boolean getMultipic() {
return mMultipic;
} public String getTitle() {
return mTitle;
} public Long getType() {
return mType;
} @Override
public String toString() {
return "Stories{" +
"mGaPrefix='" + mGaPrefix + '\'' +
", mId=" + mId +
", mImages=" + mImages +
", mMultipic=" + mMultipic +
", mTitle='" + mTitle + '\'' +
", mType=" + mType +
'}';
}
}

4.定义Retrofit和Volley的单例管理

获取Retrofit单例
public class RetrofitManager {
static final String BASE_URL = "http://news-at.zhihu.com/api/4/news/";
private Retrofit retrofit;
private static RetrofitManager ourInstance = new RetrofitManager(); public static RetrofitManager getInstance() {
return ourInstance;
} private RetrofitManager() {
} /**
* 获取retrofit单例
*
* @return Retrofit single
*/
public Retrofit getRetrofit() {
if (retrofit == null) {
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
}
获取Volley RequestQueue单例
public class VolleyManager {
private RequestQueue requestQueue;
private static VolleyManager ourInstance = new VolleyManager(); public static VolleyManager getInstance() {
return ourInstance;
} private VolleyManager() {
} /**
* 获取 volley requestQueue 单例
*
* @param context activity
* @return volley requestQueue
*/
public RequestQueue getRequestQueue(Context context) {
if (requestQueue == null) {
requestQueue = Volley.newRequestQueue(context);
}
return requestQueue;
}
}

5.定义Retrofit REST Api 接口

//获取Json数据
public interface GetNews {
@GET("latest")
Observable<Result> getNews();
} //获取图片
public interface GetBitmap {
@GET
Observable<ResponseBody> getPicFromNet(@Url String url);
} 这里使用RxJava形式的接口定义,直接返回 被观察者对象

6.获取Json数据,并返回Result对象

通过RR获取
//get data by Retrofit & RxJava
private void getDataByRetrofit() {
progressBar.setVisibility(View.VISIBLE);
storiesAdapter.setGetPicByRR(true);// tell adapter get pic by retrofit
//RR:Retrofit+RxJava
Subscriber<Result> subscriber = new Subscriber<Result>() {
@Override
public void onCompleted() { } @Override
public void onError(Throwable e) {
progressBar.setVisibility(View.INVISIBLE);
Toast.makeText(context, e.getMessage(), Toast.LENGTH_SHORT).show();
} @Override
public void onStart() {
super.onStart();
storiesList.clear();
} //设置数据到RecyclerView
@Override
public void onNext(Result result) {
storiesList.addAll(result.getStories());
storiesAdapter.notifyDataSetChanged();
progressBar.setVisibility(View.INVISIBLE);
}
};
//主要逻辑
GetNews getNews = RetrofitManager.getInstance().getRetrofit().create(GetNews.class);
getNews.getNews()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
}
通过Volley获取
/**
* get data by volley
*/
private void getDataByVolley() {
progressBar.setVisibility(View.VISIBLE);
storiesAdapter.setGetPicByRR(false);// tell adapter get pic by volley
//主要逻辑
StringRequest stringRequest = new StringRequest(Request.Method.GET,
RetrofitManager.BASE_URL + "latest",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
//Json to Bean
Gson gson = new Gson();
Result result = gson.fromJson(response, Result.class);
storiesList.addAll(result.getStories());
//设置数据到RecyclerView
storiesAdapter.notifyDataSetChanged();
progressBar.setVisibility(View.INVISIBLE);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(context, error.getMessage(), Toast.LENGTH_SHORT).show();
}
});
VolleyManager.getInstance().getRequestQueue(this.getApplication()).add(stringRequest);
}

7.Adapter中获取图片

通过RR获取
//get pic by Retrofit and RxJava
Action1<Bitmap> bitmapAction1 = new Action1<Bitmap>() {
@Override
public void call(Bitmap bitmap) {
holder.ivImg.setImageBitmap(bitmap);
}
};
String url = stories.getImages().get(0);
GetBitmap getBitmap = RetrofitManager.getInstance().getRetrofit().create(GetBitmap.class);
getBitmap.getPicFromNet(url)
.map(new Func1<ResponseBody, Bitmap>() {
@Override
public Bitmap call(ResponseBody responseBody) {
//decode pic
return BitmapFactory.decodeStream(responseBody.byteStream());
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(bitmapAction1);
通过Volley获取
//get pic by volley
ImageLoader imageLoader = new ImageLoader(VolleyManager.getInstance()
.getRequestQueue(context.getApplicationContext())
, new ImageLoader.ImageCache() {
@Override
public Bitmap getBitmap(String url) {
return null;
} @Override
public void putBitmap(String url, Bitmap bitmap) { }
});
ImageLoader.ImageListener imageListener = ImageLoader.getImageListener(holder.ivImg, R.mipmap.ic_launcher, R.mipmap.ic_launcher);
String url = stories.getImages().get(0);
imageLoader.get(url, imageListener);

8.总结

这里只是从简单的使用层面上对比了RR和Volley两者使用上的不同,之前获取网络数据的任务都是交给Volley来做。

有时获取了A数据之后,马上需要进行下一步包装分析A之后获取B数据。

如果是在Volley中就会出现嵌套的逻辑;在RxJava中使用Retrofit就可以使用它的map(或flatMap)进行A数据的包装分析,之后返回B数据的,就不会出现嵌套的逻辑。

以上只是小生简单的对比,用以自身理解RxJava,有什么不对的地方欢迎各位指出 _

9.整体代码放在GitHub上,欢迎浏览

RxJava结合Retrofit和Volley简单比较的更多相关文章

  1. RxJava 与 Retrofit 结合的最佳实践

    转自:http://gank.io/post/56e80c2c677659311bed9841?from=timeline&isappinstalled=0&nsukey=g1D1Y6 ...

  2. Android开发okhttp,retrofit,android-async-http,volley?

    okhttp, retrofit,android-async-http,volley这四个框架适用的场合?优缺点?各位大大,请给一些建议.我准备开发一个新的APP 如果是标准的RESTful API, ...

  3. RxJava整合Retrofit遇到的问题总结

    一:初上手(填坑) Observable将事件序列执行完毕后,会回调Observe的onNext()方法和onCompleted()方法,当出现异常/错误时会调用onError()方法. 由此,我们推 ...

  4. Kotlin封装RxJava与Retrofit

    代码地址:https://github.com/DarkPointK/RxTrofit.git 前言 Retrofit是Square公司开发的一个类型安全的Java和Android 的REST客户端库 ...

  5. (转载)RxJava 与 Retrofit 结合的最佳实践

    RxJava 与 Retrofit 结合的最佳实践 作者:tough1985 感谢 DaoCloud 为作者提供的 500 RMB 写作赞助: 成为赞助方 /开始写作 前言 RxJava和Retrof ...

  6. rxjava 调用retrofit执行网络请求的过程

    retrofit流程图 -1.RxJava调用Retrofit,从requestGtPushSaeUserInfo()中获得被观察者observable,然后new一个观察者向它订阅   0.从业务中 ...

  7. [Android] 转-RxJava+MVP+Retrofit+Dagger2+Okhttp大杂烩

    原文url: http://blog.iliyun.net/2016/11/20/%E6%A1%86%E6%9E%B6%E5%B0%81%E8%A3%85/ 这几年来android的网络请求技术层出不 ...

  8. Rxjava, RxAndroid, Retrofit 等库的使用

    RxJava的基本用法: 关于 unSubscribe() 的调用问题: There is no need to unsubscribe in onCompleted. Take a look at  ...

  9. RxJava开发精要8 – 与REST无缝结合-RxJava和Retrofit

    原文出自<RxJava Essentials> 原文作者 : Ivan Morgillo 译文出自 : 开发技术前线 www.devtf.cn 转载声明: 本译文已授权开发者头条享有独家转 ...

随机推荐

  1. PE渲染引擎 一

    PE是我业余时间做的一个纯dx11的渲染框架.主要就是练手.如果有时间,会把它“扩展”成真正的引擎(标配至少要有个对应的编辑器吧 -_!!). 目前实现的有: obj文件加载,binormal计算. ...

  2. vs2010 C#链接 ACCESS数据库

    ACCESS数据库,有2003.2007版本,不同的版本,链接字符也不同,现把代码黏贴如下: 1.ACCESS2003(.mdb): private void Form1_Load(object se ...

  3. 斜堆(一)之 C语言的实现

    概要 本章介绍斜堆.和以往一样,本文会先对斜堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现:实现的语言虽不同,但是原理如出一辙,选择其中之一进行了解即可.若文 ...

  4. 【转载】debian上快速搭建ftp

    转载自:http://suifengpiaoshi.diandian.com/post/2012-05-05/17955899 搭建ftp 包括搭建ftp服务器和ftp客户端 本文以debian上搭建 ...

  5. vim编辑器的基本使用

        VIM的操作模式     Command Mode 命令模式     Insert Mode 输入模式     Last Line Mode 底行模式       vim abc 如果文件存在 ...

  6. [linux]执行pip安装的程序:command not found

    执行pip安装的程序:command not found 问题描述: 我有一台阿里云服务器,上面装的是centos系统,我用pip安装好vituralenv,都没办法直接启动.同样 我今天在部署我的t ...

  7. IE下点击scrollbar会导致焦点移动到body

    现象 IE这货果然与众不同,当光标焦点在input时,点击同页面内其他区域的scrollbar,会导致焦点移动到body,从而触发绑定在input上的blur事件,如果input中的值与之前不同,甚至 ...

  8. STL or Force --- CSU 1553: Good subsequence

    Good subsequence Problem's Link:   http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1553 Mean: 给你一个长 ...

  9. UnityShader快速上手指南(三)

    简介 这一篇还是一些基本的shader操作:裁剪.透明和法向量的应用 (纠结了很久写不写这些,因为代码很简单,主要是些概念上的东西) 先来看下大概的效果图:(从左到右依次是裁剪,透明,加了法向量的透明 ...

  10. Mongodb:修改文档结构后出现错误:Element '***' does not match any field or property of class ***.

    Mongodb:修改文档结构后出现错误:Element '***' does not match any field or property of class ***. Mongodb是一种面向文档的 ...