Retrofit使用教程(三):Retrofit与RxJava初相逢(个人感觉好理解一些)

2024-06-03 12:48

本文主要是介绍Retrofit使用教程(三):Retrofit与RxJava初相逢(个人感觉好理解一些),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上一篇文章讲述了Retrofit的基本使用,包括GET,POST等请求.今天的文章中Retrofit要与RxJava配合使用.

了解RxJava

RxJava有种种好处,我不在这里一一讲述.这里我只给出一个使用RxJava的例子.如果想更深入地了解RxJava,可以参考以下文章:

给Android开发者的RxJava详解

RxJava Essentials 中文翻译版

接下来的文章,我也会写RxJava的进一步使用的.

案例说明

该例子是获取手机上安装的APP,然后列表显示包括名称,图标,安装时间等信息.

上代码

下面是自定义的 AppInfo 类,包含名称,图标,安装时间,版本号,版本名称等属性.

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;}@Overridepublic String toString() {return "AppInfo{" +"name='" + name + '\'' +", installTime='" + installTime + '\'' +", versionCode='" + versionCode + '\'' +", versionName='" + versionName + '\'' +", icon=" + icon +'}';}
}

下面是获取AppLie表的代码,封装为工具类使用:

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));}
}

不使用RxJava怎么做?

我们在不适用RxJava时怎么做?通常新建一个子线程去执行任务,然后回调更新界面,对不对?

private void getByNormal() {refreshLayout.setRefreshing(true);infoList.clear();appAdapter.notifyDataSetChanged();new AsyncTask<Void, Void, List<AppInfo>>(){@Overrideprotected List<AppInfo> doInBackground(Void... params) {return AppHelper.getHelper().getListByNormal(MainActivity.this);}@Overrideprotected void onPostExecute(List<AppInfo> appInfos) {infoList.addAll(appInfos);appAdapter.notifyDataSetChanged();refreshLayout.setRefreshing(false);}};
}

使用RxJava

使用RxJava是这样来写代码的:

1.创建 Observable

public Observable<List<AppInfo>> getListByRxJava(final Context context){Observable<List<AppInfo>> observer = Observable.create(new Observable.OnSubscribe<List<AppInfo>>() {@Overridepublic void call(Subscriber<? super List<AppInfo>> subscriber) {List<AppInfo> infoList = AppUtil.getAppList(context);subscriber.onNext(infoList);subscriber.onCompleted();}});return observer;
}

2.在界面出调用

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>>() {@Overridepublic void onCompleted() {appAdapter.notifyDataSetChanged();refreshLayout.setRefreshing(false);}@Overridepublic void onError(Throwable e) {}@Overridepublic void onNext(List<AppInfo> list) {infoList.addAll(list);}});
}

看结果

这个Demo的源码在此: RxJavaDemo

在Retrofit中使用RxJava

上次我们获取手机的归属地时的 PhoneService 中是这样写的:

@GET("/apistore/mobilenumber/mobilenumber")
Call<PhoneResult> getResult(@Header("apikey") String apikey,@Query("phone") String phone);

返回了一个Call对象,使用RxJava我们则返回一个可被观测的 PhoneResult : Observable<PhoneResult> ,如下:

@GET("/apistore/mobilenumber/mobilenumber")
Observable<PhoneResult> getPhoneResult(@Header("apikey") String apikey,@Query("phone") String phone);

为了能返回此对象,我们需要在创建Retrofit对象时添加一个RxJava对象的Adapter来自动完成:

Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL).addCallAdapterFactory(RxJavaCallAdapterFactory.create()).addConverterFactory(GsonConverterFactory.create()).build();

为此,还封装了一个单例模式的 PhoneApi 类:

/*** 手机号相关的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;}
}

下面就是使用去获取手机的归属地啦:

phoneService.getPhoneResult(PhoneApi.API_KEY, number).subscribeOn(Schedulers.newThread())    //子线程访问网络.observeOn(AndroidSchedulers.mainThread())  //回调到主线程.subscribe(new Observer<PhoneResult>() {@Overridepublic void onCompleted() {}@Overridepublic void onError(Throwable e) {}@Overridepublic void onNext(PhoneResult result) {if (result != null && result.getErrNum() == 0) {PhoneResult.RetDataEntity entity = result.getRetData();resultView.append("地址:" + entity.getCity());}}});
}

运行一下吧,结果是同样的哈.

项目地址在此: Dev-Wiki/RetrofitDemo

更多文章请移步我的博客:DevWiki Blog

重要说明

想随时获取最新博客文章更新,请关注公共账号DevWiki,或扫描下面的二维码:

这篇关于Retrofit使用教程(三):Retrofit与RxJava初相逢(个人感觉好理解一些)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1027034

相关文章

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

springboot security之前后端分离配置方式

《springbootsecurity之前后端分离配置方式》:本文主要介绍springbootsecurity之前后端分离配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的... 目录前言自定义配置认证失败自定义处理登录相关接口匿名访问前置文章总结前言spring boot secu

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

java中反射(Reflection)机制举例详解

《java中反射(Reflection)机制举例详解》Java中的反射机制是指Java程序在运行期间可以获取到一个对象的全部信息,:本文主要介绍java中反射(Reflection)机制的相关资料... 目录一、什么是反射?二、反射的用途三、获取Class对象四、Class类型的对象使用场景1五、Class

SpringBoot中封装Cors自动配置方式

《SpringBoot中封装Cors自动配置方式》:本文主要介绍SpringBoot中封装Cors自动配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot封装Cors自动配置背景实现步骤1. 创建 GlobalCorsProperties