老婆保佑,代码无BUG

目录

引用

与其他开源请求库对比

Retrofit注解

使用

GET请求

POST请求

Retrofit2 + RxJava

基础使用

优化

封装Retrofit2 + RxJava

一:引用

compile 'com.squareup.retrofit2:retrofit:2.3.0'

二:与其他开源请求库对比

image

三:Retrofit注解

四:使用

GET请求

(1) 定义接口

public interface ApiService {

@GET

Call getGetData(@Url String url);

//Get请求,方法中指定@Path参数和@Query参数

//@path参数用于替换url中{}的部分,

//@Query将在url地址中追加类似"page=1"的字符串

@GET("{mobile}/get?")

Call getPathData(@Path("mobile") String mobile, @Query("phone") String phone, @Query("key") String key);

@GET("mobile/get?")

Call getQueryMapData(@QueryMap Map map);

}

(2) Activity

public void btnYS(View view) {

String baseUrl = "http://apis.juhe.cn/";

String url = baseUrl + "mobile/get?phone=18856907654&key=5778e9d9cf089fc3b093b162036fc0e1";

Retrofit retrofit = new Retrofit.Builder()

.baseUrl(baseUrl)

.build();

ApiService apiService = retrofit.create(ApiService.class);

//第一种

Call call = apiService.getGetData(url);

//第二种

HashMap map = new HashMap<>();

map.put("phone", "18856907654");

map.put("key", "5778e9d9cf089fc3b093b162036fc0e1");

Call call = apiService.getQueryMapData(map);

//第三种

apiService.getPathData("mobile","18856907654","5778e9d9cf089fc3b093b162036fc0e1");

call.enqueue(new Callback() {

@Override

public void onResponse(Call call, Response response) {

//主线程

try {

Logger.e("response---->" + response.body().string());

} catch (IOException e) {

e.printStackTrace();

}

}

@Override

public void onFailure(Call call, Throwable t) {

Logger.e("Throwable---->" + t.getMessage());

}

});

}

POST请求

(1) 定义接口

public interface ApiService {

@FormUrlEncoded

@POST("mobile/get") //注意 不是 / 结束

Call postFile(@Field("phone") String phone,

@Field("key") String key);

@FormUrlEncoded

@POST("mobile/get") //注意 不是 / 结束

Call postFile(@FieldMap Map map);

}

(2) Activity

public void btnPostFile(View view) {

String baseUrl = "http://apis.juhe.cn/";

Retrofit retrofit = new Retrofit.Builder()

.baseUrl(baseUrl)

.build();

ApiService apiService = retrofit.create(ApiService.class);

//第一种

Call call = apiService.postFile("18856907654", "5778e9d9cf089fc3b093b162036fc0e1");

//第二种

HashMap map = new HashMap<>();

map.put("phone", "18856907654");

map.put("key", "5778e9d9cf089fc3b093b162036fc0e1");

Call call = apiService.postFile(map);

//省略一下代码

}

以上讲的都是废话,哈哈下面才是正确的打开放式

Retrofit2 + RxJava

引入 依赖

//Retrofit2

compile 'com.squareup.retrofit2:retrofit:2.3.0'

//RxJava

compile 'io.reactivex.rxjava2:rxjava:2.1.7'

//RxAndroid

compile 'io.reactivex.rxjava2:rxandroid:2.0.1'

//Retrofit 支持Rxjava 的支持库

compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'

先导入,然后慢慢说,这些都是干啥的

按套路出牌,肯定先写接口

public interface ApiService {

@GET

Observable getGetData(@Url String url);

}

看到这,就有兄弟说了,哥们你这里写错了,不应该是Observable应该是Call

u=1804519813,2654766997&fm=27&gp=0.jpg

都说了 之前说的都是屁话,这才是正确的打开方式,我们使用的是Observable,RxJava ,都是这么玩的 哈哈

so 继续

Activity 先来一个看看

package com.allens.retrofitdemo;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;

import io.reactivex.Observer;

import io.reactivex.android.schedulers.AndroidSchedulers;

import io.reactivex.disposables.Disposable;

import io.reactivex.functions.Consumer;

import io.reactivex.schedulers.Schedulers;

import okhttp3.ResponseBody;

import retrofit2.Retrofit;

public class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

String baseUrl = "http://apis.juhe.cn/";

String url = baseUrl + "mobile/get?phone=18856907654&key=5778e9d9cf089fc3b093b162036fc0e1";

// 设置网络请求的Url地址

Retrofit retrofit = new Retrofit.Builder()

.baseUrl("http://fanyi.youdao.com/")

// 支持RxJava平台

//compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0' 是他 就是他

.addCallAdapterFactory(RxJava2CallAdapterFactory.create())

.build();

retrofit.create(ApiService.class)

.getGetData(url)//注意看,这里返回的对象时什么,和原生的返回不同,也是我们把上面接口改的原因

//在子线程取数据

.subscribeOn(Schedulers.io())

.unsubscribeOn(Schedulers.io())

//在主线程显示ui

// compile 'io.reactivex.rxjava2:rxandroid:2.0.1' 这个库下才有AndroidSchedulers.mainThread

.observeOn(AndroidSchedulers.mainThread())

.subscribe(new Observer() {

@Override

public void onSubscribe(Disposable d) {

}

@Override

public void onNext(ResponseBody responseBody) {

}

@Override

public void onError(Throwable e) {

}

@Override

public void onComplete() {

}

});

}

}

是不是感觉很简单。哈哈,对就是这么简单。Post 请求也这么玩,其他都不变,改一下接口,改成 Observable,然后使用RxJava 切换线程就哦了,

如果只是这种程度你就满足了,哈哈,大兄弟,你也太容易了,

其实我们还可以这么玩

五:优化

1. 设置数据解析器

(1)添加一条依赖

//gson 解析器

compile 'com.squareup.retrofit2:converter-gson:2.3.0'

修改接口

public interface ApiService {

@GET

Observable getGetData(@Url String url);

}

找不同,哈哈 原来的是ResponseBody,现在是Bean,至于Bean 是什么,Bean 对象啊,大兄弟,这个不知道的话,表示。。。。

修改一下Activity中的代码

Retrofit retrofit = new Retrofit.Builder()

.baseUrl("http://fanyi.youdao.com/")

// 设置数据解析器

.addConverterFactory(GsonConverterFactory.create())

.addCallAdapterFactory(RxJava2CallAdapterFactory.create())

.build();

retrofit.create(ApiService.class)

.getGetData(url)

.subscribeOn(Schedulers.io())

.unsubscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(new Observer() {

@Override

public void onSubscribe(Disposable d) {

}

@Override

public void onNext(Bean bean) {

}

@Override

public void onError(Throwable e) {

}

@Override

public void onComplete() {

}

});

可以看到,原来返回的是ResponseBody,现在返回的是已经解析成功的Bean 对象,

关于数据解析器(Converter)

Retrofit支持多种数据解析方式

使用时需要在Gradle添加依赖

数据解析器

Gradle依赖

Gson

com.squareup.retrofit2:converter-gson:2.0.2

Jackson

com.squareup.retrofit2:converter-jackson:2.0.2

Simple XML

com.squareup.retrofit2:converter-simplexml:2.0.2

Protobuf

com.squareup.retrofit2:converter-protobuf:2.0.2

Moshi

com.squareup.retrofit2:converter-moshi:2.0.2

Wire

com.squareup.retrofit2:converter-wire:2.0.2

Scalars

com.squareup.retrofit2:converter-scalars:2.0.2

网络请求适配器(CallAdapter)

还记得compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0' 么,他其实就是一个网络请求适配器

使用时如使用的是 Android 默认的 CallAdapter,则不需要添加网络请求适配器的依赖,否则则需要按照需求进行添加

Retrofit 提供的 CallAdapter

使用时需要在Gradle添加依赖:

网络请求适配器

Gradle依赖

备注

guava

com.squareup.retrofit2:adapter-guava:2.0.2

没用过

Java8

com.squareup.retrofit2:adapter-java8:2.0.2

没用过

rxjava

com.squareup.retrofit2:adapter-rxjava:2.0.2

retrofit现在只支持到rxjava1.XX

rxjava

com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.

大神写的这个库可以支持到rxjava2.X

到这里就是不是就感觉,人生圆满了呢,哈哈

还有后招呢,现在我想把服务端返回的数据全部打印出来,怎么做呢

u=1379330171,3486067710&fm=27&gp=0.jpg

2.加入拦截器

(1)导入库

compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'

(2)初始化HttpLoggingInterceptor

HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {

@Override

public void log(String message) {

//打印retrofit日志

Log.i("RetrofitLog","retrofitBack = "+message);

}

});

loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

(3)配置okhttp

client = new OkHttpClient.Builder()

.addInterceptor(loggingInterceptor)

.connectTimeout(mTimeOut, TimeUnit.SECONDS)

.readTimeout(mTimeOut, TimeUnit.SECONDS)

.writeTimeout(mTimeOut, TimeUnit.SECONDS)

.build();

然后嘛,

就可以在控制台看到请求的Log啦

12-28 04:29:07.337 3922-3944/com.allens.test E/XRetrofit: retrofitBack ->

12-28 04:29:07.337 3922-3944/com.allens.test E/XRetrofit: retrofitBack -> Date: Thu, 28 Dec 2017 09:29:10 GMT

12-28 04:29:07.337 3922-3944/com.allens.test E/XRetrofit: retrofitBack -> Server: Apache/2.4.17 (Win64) OpenSSL/1.0.2d PHP/5.6.16

12-28 04:29:07.337 3922-3944/com.allens.test E/XRetrofit: retrofitBack -> X-Powered-By: PHP/5.6.16

12-28 04:29:07.337 3922-3944/com.allens.test E/XRetrofit: retrofitBack -> Content-Length: 104

12-28 04:29:07.337 3922-3944/com.allens.test E/XRetrofit: retrofitBack -> Keep-Alive: timeout=5, max=100

12-28 04:29:07.337 3922-3944/com.allens.test E/XRetrofit: retrofitBack -> Connection: Keep-Alive

12-28 04:29:07.337 3922-3944/com.allens.test E/XRetrofit: retrofitBack -> Content-Type: application/json; charset=utf-8

12-28 04:29:07.338 3922-3944/com.allens.test E/XRetrofit: retrofitBack ->

12-28 04:29:07.338 3922-3944/com.allens.test E/XRetrofit: retrofitBack -> {"is_success":true,"result":{"code":"9405f14110770bf8bd09d1397173e382eab923b19820b9330ce7d533cb3d4722"}}

12-28 04:29:07.338 3922-3944/com.allens.test E/XRetrofit: retrofitBack ->

六: 最后在优化

哈哈,自己封装了一下,有兴趣的小伙伴可以点击查看,及使用

android retrofit2.0 rxjava2,Android - 网络请求之 Retrofit2 + RxJava相关推荐

  1. Android 9.0以上HTTP网络请求被限制解决方案

    问题 Android 9.0以上系统,HTTP网络访问请求被限制:但是HTTPS无影响. Android 10系统同样有此问题. 为保证访问安全,Android P以上要求网络请求必须为Https:H ...

  2. Android 9.0/P(android p指安卓9.0版本) okhttp3网络请求出错

    已经在AndroidManifest.xml申请网络权限,在8.0以下的系统中网络访问正常,但是9.0中出现网络请求失败 Android 9.0的网络请求失败如下图: 出现这个错误的原因是:从Andr ...

  3. android okgo 参数map,OkGo 网络请求框架介绍与使用说明

    前言 使用 Android Studio 用户 一般来说,只需要添加第一个 okgo 的核心包即可,其余的三个库根据自己的需要选择添加. //必须使用 compile 'com.lzy.net:okg ...

  4. android 7.0 短信监控,Android 7.0 监听网络变化的示例代码

    Android7.0前,Android系统前网络切换时,会发广播,业务只要监听广播即可. public class NetChangeReceiver extends BroadcastReceive ...

  5. android界面之美---自定义网络请求进度加载对话框

    1.定义进度对话框类 <span style="font-size:18px;">public class ProgressDialog {public Dialog ...

  6. Android Asynchronous Http Client-Android异步网络请求客户端接口

    1.简介 Android中网络请求一般使用Apache HTTP Client或者采用HttpURLConnect,但是直接使用这两个类库需要写大量的代码才能完成网络post和get请求,而使用and ...

  7. 在Mac下使用Charles抓取Android 7.0以上的Https请求

    文章目录 一.Charles 设置 1. 第一步 2. 第二步 3. 第三步 3. 第四步开启SSL代理功能 二.手机安装证书 三.APP 网络安全配置 四.另一种抓包方式   因为开发需求,需要抓取 ...

  8. Android 避免主线程执行网络请求之Activity/Fragment 结束后处理异步回调

    大家都知道Android涉及到与UI相关的操作只能在主线程执行 android4.0以后就禁止在主线程进行网络请求了,在主线程里面执行Http请求都会报NetworkOnMainThreadExcep ...

  9. Android 页面或文件或网络请求时的加载动画

    //加载图片或页面或网络请求时出现加载动画 public Class LoadingAnimation{ private static LoadingAnimation loadingAnimatio ...

最新文章

  1. 网传京东某程序员因压力太大,在商品页面置入骂人代码!京东辟谣:不关我们的事,外部商家干的!...
  2. eclipse常见错误
  3. 实事求是来讲,比较艰难的环境能够激发人的斗志
  4. html中给文章怎么设置行高,css如何设置行距?
  5. 用aspnet_compiler发布网站 (转载:My way of my life )
  6. 算法:阶乘的五种算法
  7. 微信占用空间太大,删除又担心工作相关聊天记录,有啥好办法没?
  8. 在VBA中使用正则表达式
  9. [转]MySQL和SQLServer的比较
  10. 【emWin】例程二十二:窗口对象——Framewin
  11. 微信小程序的弹窗提示
  12. leo-校园文化户口管理系统
  13. Halo博客搭建笔记(以Nginx反向代理 + 负载均衡 + 服务的方式运行Halo博客)
  14. matlab无法打开wps的xls文件,xls文件怎么打开,wps无法打开xls文件怎么办
  15. Assignment | 05-week3 -Part_1-Neural Machine Translation
  16. 王者荣耀最低战力查询-王者战区修改
  17. 解决使用CSV包,将写入字符串写入csv文件时字符串被拆分成很多单元的问题
  18. 使用DriverManager动态加载JDBC驱动时,报:java.sql.SQLException: No suitable driver found for xxxx 错误
  19. tomcat调优-占用内存太多
  20. 网上销售平台--需求分析(二)

热门文章

  1. java保存base64图片_java保存base64位的图片,并且用时间文件夹分割
  2. c语言输入的成绩由高到低该怎么,输入成绩,按照平均分从高到低输出
  3. linux rpm 修复,记录一下修复yum及rpm的过程
  4. python string类型_Python的基本数据类型——String
  5. 线程池的简单创建和实现
  6. Luogu2114 [NOI2014]起床困难综合症 【位运算】
  7. 前端工作面试问题(下)
  8. 转:C# 线程同步技术 Monitor 和Lock
  9. linux安装unzip及使用
  10. GridView分页后RowCommand出错:索引超出范围