Android Retrofit使用教程(三):Retrofit与RxJava初相逢
上一篇文章讲述了Retrofit的基本使用,包括GET,POST等请求.今天的文章中Retrofit要与RxJava配合使用.
了解RxJava
RxJava有种种好处,我不在这里一一讲述.这里我只给出一个使用RxJava的例子.
接下来的文章,我也会写RxJava的进一步使用的.
案例说明
该例子是获取手机上安装的APP,然后列表显示包括名称,图标,安装时间等信息.
上代码
下面是自定义的AppInfo
类,包含名称,图标,安装时间,版本号,版本名称等属性.
[代码]java代码:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
public class AppInfo {
private String name;
private String installTime;
private int versionCode;
private String versionName;
private Drawable icon;
public String getName() {
return name;
}
public void setName(String name) {
this .name = name;
}
public String getInstallTime() {
return installTime;
}
public void setInstallTime(String installTime) {
this .installTime = installTime;
}
public int getVersionCode() {
return versionCode;
}
public void setVersionCode( int versionCode) {
this .versionCode = versionCode;
}
public String getVersionName() {
return versionName;
}
public void setVersionName(String versionName) {
this .versionName = versionName;
}
public Drawable getIcon() {
return icon;
}
public void setIcon(Drawable icon) {
this .icon = icon;
}
@Override
public String toString() {
return "AppInfo{" +
"name='" + name + '\ '' +
", installTime='" + installTime + '\ '' +
", versionCode='" + versionCode + '\ '' +
", versionName='" + versionName + '\ '' +
", icon=" + icon +
'}' ;
}
}
|
下面是获取AppLie表的代码,封装为工具类使用:
[代码]java代码:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
public class AppUtil {
/**
* 获取已安装的APP的列表
* @param context 上下文
* @return AppInfo列表
*/
public static List<appinfo> getAppList(Context context){
List<appinfo> appInfoList = new ArrayList<>();
List<packageinfo> packages = context.getPackageManager()
.getInstalledPackages(PackageManager.GET_ACTIVITIES);
for (PackageInfo packageInfo : packages) {
AppInfo appInfo = new AppInfo();
appInfo.setName(packageInfo.applicationInfo
.loadLabel(context.getPackageManager())
.toString());
appInfo.setIcon(packageInfo.applicationInfo
.loadIcon(context.getPackageManager()));
appInfo.setInstallTime(getFormatTime(packageInfo.firstInstallTime));
appInfo.setVersionCode(packageInfo.versionCode);
appInfo.setVersionName(packageInfo.versionName);
appInfoList.add(appInfo);
}
return appInfoList;
}
public static String getFormatTime( long time){
if (time <= 0 ){
return "" ;
}
return SimpleDateFormat.getDateInstance(DateFormat.FULL).format( new Date(time));
}
}</packageinfo></appinfo></appinfo>
|
不使用RxJava怎么做?
我们在不适用RxJava时怎么做?通常新建一个子线程去执行任务,然后回调更新界面,对不对?
[代码]java代码:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
private void getByNormal() {
refreshLayout.setRefreshing( true );
infoList.clear();
appAdapter.notifyDataSetChanged();
new AsyncTask< void , void ,= "" list<appinfo= "" >>(){
@Override
protected List<appinfo> doInBackground(Void... params) {
return AppHelper.getHelper().getListByNormal(MainActivity. this );
}
@Override
protected void onPostExecute(List<appinfo> appInfos) {
infoList.addAll(appInfos);
appAdapter.notifyDataSetChanged();
refreshLayout.setRefreshing( false );
}
};
}</appinfo></appinfo></ void ,>
|
使用RxJava
使用RxJava是这样来写代码的:
1.创建Observable
[代码]java代码:
01
02
03
04
05
06
07
08
09
10
11
12
|
public Observable<list<appinfo>> getListByRxJava( final Context context){
Observable<list<appinfo>> observer = Observable.create(
new Observable.OnSubscribe<list<appinfo>>() {
@Override
public void call(Subscriber<!--? super List<AppInfo-->> subscriber) {
List<appinfo> infoList = AppUtil.getAppList(context);
subscriber.onNext(infoList);
subscriber.onCompleted();
}
});
return observer;
}</appinfo></list<appinfo></list<appinfo></list<appinfo>
|
2.在界面出调用
[代码]java代码:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
private void getByRxJava() {
refreshLayout.setRefreshing( true );
infoList.clear();
appAdapter.notifyDataSetChanged();
AppHelper.getHelper().getListByRxJava( this )
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe( new Subscriber<list<appinfo>>() {
@Override
public void onCompleted() {
appAdapter.notifyDataSetChanged();
refreshLayout.setRefreshing( false );
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(List<appinfo> list) {
infoList.addAll(list);
}
});
}</appinfo></list<appinfo>
|
看结果
这个Demo的源码在此:RxJavaDemo
在Retrofit中使用RxJava
上次我们获取手机的归属地时的PhoneService
中是这样写的:
[代码]java代码:
1
2
3
|
@GET ( "/apistore/mobilenumber/mobilenumber" )
Call<phoneresult> getResult( @Header ( "apikey" ) String apikey,
@Query ( "phone" ) String phone);</phoneresult>
|
返回了一个Call对象,使用RxJava我们则返回一个可被观测的PhoneResult
:Observable<PhoneResult>
,如下:
[代码]java代码:
1
2
3
|
@GET ( "/apistore/mobilenumber/mobilenumber" )
Observable<phoneresult> getPhoneResult( @Header ( "apikey" ) String apikey,
@Query ( "phone" ) String phone);</phoneresult>
|
为了能返回此对象,我们需要在创建Retrofit对象时添加一个RxJava对象的Adapter来自动完成:
[代码]java代码:
1
2
3
4
5
|
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
|
为此,还封装了一个单例模式的PhoneApi
类:
[代码]java代码:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
/**
* 手机号相关的API
* Created by Asia on 2016/3/24 0024.
*/
public class PhoneApi {
/**
* HOST地址
*/
public static final String BASE_URL = "http://apis.baidu.com" ;
/**
* 开发者Key
*/
public static final String API_KEY = "8e13586b86e4b7f3758ba3bd6c9c9135" ;
/**
* 获取PhoneApi实例
* @return
*/
public static PhoneApi getApi(){
return ApiHolder.phoneApi;
}
static class ApiHolder{
private static PhoneApi phoneApi = new PhoneApi();
}
private PhoneService service;
private PhoneApi(){
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
service = retrofit.create(PhoneService. class );
}
/**
* 获取PhoneService实例
* @return
*/
public PhoneService getService(){
return service;
}
}
|
下面就是使用去获取手机的归属地啦:
[代码]java代码:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
phoneService.getPhoneResult(PhoneApi.API_KEY, number)
.subscribeOn(Schedulers.newThread()) //子线程访问网络
.observeOn(AndroidSchedulers.mainThread()) //回调到主线程
.subscribe( new Observer<phoneresult>() {
@Override
public void onCompleted() {}
@Override
public void onError(Throwable e) {}
@Override
public void onNext(PhoneResult result) {
if (result != null && result.getErrNum() == 0 ) {
PhoneResult.RetDataEntity entity = result.getRetData();
resultView.append( "地址:" + entity.getCity());
}
}
});
}</phoneresult>
|
运行一下吧,结果是同样的哈.
Android Retrofit使用教程(三):Retrofit与RxJava初相逢相关推荐
- android真实项目教程(三)——首页初点缀_by_CJJ
大家晚上好,CJJ不好,前天打球,把右手弄脱臼了...搞得我现在只能一只手敲代码...那效率,我给自己跪了 ...写了好久,才写了那么一丁点...明明还有好多要说的...也只能等手好了再继续吧...呵 ...
- Android Studio系列教程三:快捷键
原文出处:http://stormzhang.com/devtools/2014/12/09/android-studio-tutorial3/ Android Studio 1.0正式版发布啦 今天 ...
- android studio代码教程,史上最详细的Android Studio系列教程三
Android Studio 1.0正式版发布啦 今天是个大日子,Android Studio 1.0 终于发布了正式版, 这对于Android开发者来说简直是喜大普奔的大消息啊,那么就果断来下载使用 ...
- Android Studio 使用教程(三十)之 获取debug和release版本的SHA1和MD5
Android项目开发过程中常常需要知道测试版本和发布版本的SHA1和MD5 比如高德地图API AndroidStudio 1.获取debug 版本 打开CMD,输入: cd .android ke ...
- Android 日历开发教程[三]
二.创建样式 日历显示的表格线,使用 Cell 填充图形的边框来实现,为了统一,我们先定义边框线的颜色及线条精细. 另外还要定义一系统填充样式等. 创建 color: color_calendar_b ...
- android逆向基础教程三
CMake下JNI动态注册及逆向 在对native层hook首先我们先了解android native 开发流程及简单的逆向关注点,在后续的hook native 层中会有更加复杂的过程,加密,加壳等 ...
- android真实项目教程(五)——有时三点两点雨_by_CJJ
大家傍晚好,我是cjj,过多十几分钟就下班了,肚子饿到要死,马上可以吃饭了...呵呵...最近事情很多,要做毕设写论文,又要上班,班里又搞什么班照,系里又一些鸡毛小事就可以累死你...晕...好像在传 ...
- ANDROID STUDIO详细教程汇总
这个系列教程在Android Studio Beta版本的时候就开始着手编写,当时就认为AS绝对会成为Android开发的未来,时至今日印证了当时的观点,作为国内最早一批AS教程之一,可以帮助从未接触 ...
- xposed hook java_[原创]Android Hook 系列教程(一) Xposed Hook 原理分析
章节内容 一. Android Hook 系列教程(一) Xposed Hook 原理分析 二. Android Hook 系列教程(二) 自己写APK实现Hook Java层函数 三. Androi ...
最新文章
- [PyQt4]项目开发中遇到的错误与解决办法
- 用OpenCV实现图像的水平镜像(翻转)变换和竖直镜像(翻转)变换(垂直镜像变换)的源码
- 【数据挖掘】数据挖掘简介 ( 6 个常用功能 | 数据挖掘结果判断 | 数据挖掘学习框架 | 数据挖掘分类 )
- python爬虫外贸客户_python 爬虫抓取亚马逊数据
- 作者:邢俊峰(1985-),男,烟台中科网络技术研究所研发工程师。
- [C# 设计模式] Iterator - 迭代器模式:我与一份奥利奥早餐的故事
- 布局网页表格要求其列平均分布的简单操作
- oracle into bl,5_Oracle_Admin_Oracle的启动模式和关闭
- Struts2实现简单的在线人数统计
- 写了个关于tomcat项目部署脚本 shell
- appium 原理解析
- CURL模拟访问网页
- SpringMVC-01-基本组件与注解式编程
- mxf转换工具(Aiseesoft MXF Converter) v9.2.36
- 将多个pdf合并为一个
- 使用vue模拟通讯录列表,对中文名拼音首字母提取并排序
- G.652与G.655单模光纤分类及对比
- 无线鼠标,滚轮不灵,迟钝多转卡怎么办
- 网口灯电路——反相器
- 【无标题】wo断层了,为了自己错误买单
热门文章
- 火狐linux ubuntu16.04,Ubuntu 16.04 安装 Firefox 48.0 beta版
- mysql innodb commit_MySQL:Innodb 关于Handler_commit每次DML增加2的原因
- es6 数组找最大值_自学Java笔记_day04_第四章 数组
- 电话双音频拨号声音中的干扰信号
- Paddle内置的网络模型
- 基于蔡氏混沌电路进行非线性共振探究
- 2021年春季学期-信号与系统-第十四次作业参考答案-第四小题参考答案
- 第十六届智能车竞赛英飞凌技术培训日程安排
- ST-3806系列单圈编码器 说明书
- oracle无法打开表的行集,Oracle错误ORA-22905:无法访问非嵌套表项中的行