上一篇文章讲述了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初相逢相关推荐

  1. android真实项目教程(三)——首页初点缀_by_CJJ

    大家晚上好,CJJ不好,前天打球,把右手弄脱臼了...搞得我现在只能一只手敲代码...那效率,我给自己跪了 ...写了好久,才写了那么一丁点...明明还有好多要说的...也只能等手好了再继续吧...呵 ...

  2. Android Studio系列教程三:快捷键

    原文出处:http://stormzhang.com/devtools/2014/12/09/android-studio-tutorial3/ Android Studio 1.0正式版发布啦 今天 ...

  3. android studio代码教程,史上最详细的Android Studio系列教程三

    Android Studio 1.0正式版发布啦 今天是个大日子,Android Studio 1.0 终于发布了正式版, 这对于Android开发者来说简直是喜大普奔的大消息啊,那么就果断来下载使用 ...

  4. Android Studio 使用教程(三十)之 获取debug和release版本的SHA1和MD5

    Android项目开发过程中常常需要知道测试版本和发布版本的SHA1和MD5 比如高德地图API AndroidStudio 1.获取debug 版本 打开CMD,输入: cd .android ke ...

  5. Android 日历开发教程[三]

    二.创建样式 日历显示的表格线,使用 Cell 填充图形的边框来实现,为了统一,我们先定义边框线的颜色及线条精细. 另外还要定义一系统填充样式等. 创建 color: color_calendar_b ...

  6. android逆向基础教程三

    CMake下JNI动态注册及逆向 在对native层hook首先我们先了解android native 开发流程及简单的逆向关注点,在后续的hook native 层中会有更加复杂的过程,加密,加壳等 ...

  7. android真实项目教程(五)——有时三点两点雨_by_CJJ

    大家傍晚好,我是cjj,过多十几分钟就下班了,肚子饿到要死,马上可以吃饭了...呵呵...最近事情很多,要做毕设写论文,又要上班,班里又搞什么班照,系里又一些鸡毛小事就可以累死你...晕...好像在传 ...

  8. ANDROID STUDIO详细教程汇总

    这个系列教程在Android Studio Beta版本的时候就开始着手编写,当时就认为AS绝对会成为Android开发的未来,时至今日印证了当时的观点,作为国内最早一批AS教程之一,可以帮助从未接触 ...

  9. xposed hook java_[原创]Android Hook 系列教程(一) Xposed Hook 原理分析

    章节内容 一. Android Hook 系列教程(一) Xposed Hook 原理分析 二. Android Hook 系列教程(二) 自己写APK实现Hook Java层函数 三. Androi ...

最新文章

  1. [PyQt4]项目开发中遇到的错误与解决办法
  2. 用OpenCV实现图像的水平镜像(翻转)变换和竖直镜像(翻转)变换(垂直镜像变换)的源码
  3. 【数据挖掘】数据挖掘简介 ( 6 个常用功能 | 数据挖掘结果判断 | 数据挖掘学习框架 | 数据挖掘分类 )
  4. python爬虫外贸客户_python 爬虫抓取亚马逊数据
  5. 作者:邢俊峰(1985-),男,烟台中科网络技术研究所研发工程师。
  6. [C# 设计模式] Iterator - 迭代器模式:我与一份奥利奥早餐的故事
  7. 布局网页表格要求其列平均分布的简单操作
  8. oracle into bl,5_Oracle_Admin_Oracle的启动模式和关闭
  9. Struts2实现简单的在线人数统计
  10. 写了个关于tomcat项目部署脚本 shell
  11. appium 原理解析
  12. CURL模拟访问网页
  13. SpringMVC-01-基本组件与注解式编程
  14. mxf转换工具(Aiseesoft MXF Converter) v9.2.36
  15. 将多个pdf合并为一个
  16. 使用vue模拟通讯录列表,对中文名拼音首字母提取并排序
  17. G.652与G.655单模光纤分类及对比
  18. 无线鼠标,滚轮不灵,迟钝多转卡怎么办
  19. 网口灯电路——反相器
  20. 【无标题】wo断层了,为了自己错误买单

热门文章

  1. 火狐linux ubuntu16.04,Ubuntu 16.04 安装 Firefox 48.0 beta版
  2. mysql innodb commit_MySQL:Innodb 关于Handler_commit每次DML增加2的原因
  3. es6 数组找最大值_自学Java笔记_day04_第四章 数组
  4. 电话双音频拨号声音中的干扰信号
  5. Paddle内置的网络模型
  6. 基于蔡氏混沌电路进行非线性共振探究
  7. 2021年春季学期-信号与系统-第十四次作业参考答案-第四小题参考答案
  8. 第十六届智能车竞赛英飞凌技术培训日程安排
  9. ST-3806系列单圈编码器 说明书
  10. oracle无法打开表的行集,Oracle错误ORA-22905:无法访问非嵌套表项中的行