网络访问框架经过了从使用最原始的AsyncTask构建简单的网络访问框架(甚至不能称为框架),后来使用开源的android-async-http库,再到使用google发布的volley库,一直不懈的寻找更好的解决方案,到现在也没找到,不过据行业所说,Retrofit算是行业比较牛逼的开源请求框架了吧,也算找 到了一些更好的方案,在这里做些记录,也做共享。

下面是我们常用的mvp模式的运行模型:

Retrofit:Square提供的开源产品,为Android平台的应用提供一个类型安全的REST客户端

[html] view
plain
 copy

  1. https://github.com/square/retrofit

RxAndroid:响应式编程框架RxJava针对Android平台的扩展。

[html] view
plain
 copy

  1. https://github.com/ReactiveX/RxAndroid
  2. https://github.com/ReactiveX/RxJava

Dagger2:依赖注入(或叫ioc,用过Spring的都知道这东东)框架,用于解耦的。

[html] view
plain
 copy

  1. https://github.com/google/dagger/

为了书写 方便,便于实践,我们用下面的地址作为服务器请求地址:http://ip.taobao.com/service/getIpInfo.php?ip=21.22.11.33

接下来我们开始新建一个项目;

1、通过配置gradle配置将Retrofit框架引入项目。

[java] view
plain
 copy

  1. compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'
  2. compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'

2、编写API服务代码

[java] view
plain
 copy

  1. package com.micky.retrofitrxandroiddagger2.data.api;
  2. import com.micky.retrofitrxandroiddagger2.data.api.response.GetIpInfoResponse;
  3. import retrofit.Call;
  4. import retrofit.http.GET;
  5. import retrofit.http.Query;
  6. import rx.Observable;
  7. public interface ApiService {
  8. @GET("service/getIpInfo.php")
  9. Call<GetIpInfoResponse> getIpInfo(@Query("ip") String ip);
  10. }

3、定义接收数据的response

[java] view
plain
 copy

  1. package com.micky.retrofitrxandroiddagger2.data.api.response;
  2. import com.micky.retrofitrxandroiddagger2.data.api.model.IpInfo;
  3. public class GetIpInfoResponse extends BaseResponse {
  4. public IpInfo data;
  5. }

4、请求数据并显示

[java] view
plain
 copy

  1. package com.micky.retrofitrxandroiddagger2;
  2. import android.os.Bundle;
  3. import android.support.design.widget.FloatingActionButton;
  4. import android.support.v7.app.AppCompatActivity;
  5. import android.support.v7.widget.Toolbar;
  6. import android.view.View;
  7. import android.view.Menu;
  8. import android.view.MenuItem;
  9. import android.widget.ProgressBar;
  10. import android.widget.TextView;
  11. import android.widget.Toast;
  12. import com.micky.retrofitrxandroiddagger2.common.utils.CrashHandler;
  13. import com.micky.retrofitrxandroiddagger2.data.api.ApiService;
  14. import com.micky.retrofitrxandroiddagger2.data.api.response.GetIpInfoResponse;
  15. import retrofit.Call;
  16. import retrofit.Callback;
  17. import retrofit.GsonConverterFactory;
  18. import retrofit.Response;
  19. import retrofit.Retrofit;
  20. import retrofit.RxJavaCallAdapterFactory;
  21. import rx.Subscriber;
  22. import rx.android.schedulers.AndroidSchedulers;
  23. import rx.functions.Action1;
  24. import rx.schedulers.Schedulers;
  25. public class MainActivity extends AppCompatActivity {
  26. private static final String ENDPOINT = "http://ip.taobao.com";
  27. private TextView mTvContent;
  28. private ProgressBar mProgressBar;
  29. @Override
  30. protected void onCreate(Bundle savedInstanceState) {
  31. super.onCreate(savedInstanceState);
  32. setContentView(R.layout.activity_main);
  33. Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
  34. setSupportActionBar(toolbar);
  35. mTvContent = (TextView) findViewById(R.id.tv_content);
  36. mProgressBar = (ProgressBar) findViewById(R.id.progress_bar);
  37. FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
  38. fab.setOnClickListener(new View.OnClickListener() {
  39. @Override
  40. public void onClick(View view) {
  41. Retrofit retrofit = new Retrofit.Builder()
  42. .baseUrl(ENDPOINT)
  43. .addConverterFactory(GsonConverterFactory.create())
  44. .build();
  45. ApiService apiService = retrofit.create(ApiService.class);
  46. mProgressBar.setVisibility(View.VISIBLE);
  47. Call<GetIpInfoResponse> call = apiService.getIpInfo("63.223.108.42");
  48. call.enqueue(new Callback<GetIpInfoResponse>() {
  49. @Override
  50. public void onResponse(Response<GetIpInfoResponse> response, Retrofit retrofit) {
  51. mProgressBar.setVisibility(View.GONE);
  52. GetIpInfoResponse getIpInfoResponse = response.body();
  53. mTvContent.setText(getIpInfoResponse.data.country);
  54. }
  55. @Override
  56. public void onFailure(Throwable t) {
  57. mProgressBar.setVisibility(View.GONE);
  58. mTvContent.setText(t.getMessage());
  59. }
  60. });
  61. }
  62. });
  63. }
  64. @Override
  65. public boolean onCreateOptionsMenu(Menu menu) {
  66. getMenuInflater().inflate(R.menu.menu_main, menu);
  67. return true;
  68. }
  69. @Override
  70. public boolean onOptionsItemSelected(MenuItem item) {
  71. int id = item.getItemId();
  72. if (id == R.id.action_settings) {
  73. return true;
  74. }
  75. return super.onOptionsItemSelected(item);
  76. }
  77. }


Android网络请求框架之Retrofit实践的更多相关文章

  1. Android网络请求框架AsyncHttpClient实例详解(配合JSON解析调用接口)

    最近做项目要求使用到网络,想来想去选择了AsyncHttpClient框架开进行APP开发.在这里把我工作期间遇到的问题以及对AsyncHttpClient的使用经验做出相应总结,希望能对您的学习有所 ...

  2. Android 网络请求框架Retrofit

    Retrofit是Square公司开发的一款针对Android网络请求的框架,Retrofit2底层基于OkHttp实现的,OkHttp现在已经得到Google官方认可,大量的app都采用OkHttp ...

  3. Android网络请求框架

    本篇主要介绍一下Android中经常用到的网络请求框架: 客户端网络请求,就是客户端发起网络请求,经过网络框架的特殊处理,让后将请求发送的服务器,服务器根据 请求的参数,返回客户端需要的数据,经过网络 ...

  4. Android 网络请求框架android-async-http问题

    今天通过接口请求服务器的一些app数据,发现一个很奇怪的问题,请求一个链接的时候,通常在第一次请求发起的时候没有什么问题,能很快的拿到数据,但是 往后再去请求的时候就会等待很久,而且最后会请求失败,一 ...

  5. Android常用网络请求框架Volley Retrofit (okHttp)

    Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient.在 Android 5.0 的时候 Google 就不推荐使用 HttpClient ...

  6. Android 网络请求框架

    1.okHttp 特点 简单.灵活.无连接.无状态 优势: 谷歌官方API在6.0之后在Android SDK中移除了HttpClient,然后他火了起来, 他支持SPDY(谷歌开发的基于TCP应用层 ...

  7. Java/Android 网络请求框架/库

    Android 图片缓存框架  最上面的最优先 com.facebook.fresco:fresco:0.12.0                7.26.2016最新 Universal-Image ...

  8. android开发学习--网络请求框架RxJava+Retrofit

    看了好多的博客,终于弄清楚了Rxjava和Retrofit,给大家推荐几个不错的文章: https://gank.io/post/56e80c2c677659311bed9841 这个文章是只用Ret ...

  9. RxAndroid+RxJava+Gson+retrofit+okhttp初步搭建android网络请求框架

    新建工程集成, 一.工具集成(2017-4-27) 首先第一步集成retrofit retrofit 的 git 网站: https://github.com/square/retrofit 在git ...

随机推荐

  1. [Vim]vim使用笔记--分屏操作

    我们经常要打开多个文件,不同的窗口操作多个文件,分屏就很好用了. 1 命令模式下: :new,新建文件并分屏, 快捷键,Ctrl+W,然后马上按n键 :spilt 水平分屏,将当前屏分为两个,水平的. ...

  2. Android4.3 屏蔽HOME按键返回桌面详解(源码环境下)

    点击打开链接 首先声明我是做系统开发的(高通平台),所以下面介绍的方法并不适合应用开发者. 最经有个需求要屏蔽HOME按键返回桌面并且实现自己的功能,发现以前的方式报错用不了,上网搜索了一下,发现都是 ...

  3. iOS下JS与OC互相调用(三)--MessageHandler

    使用WKWebView的时候,如果想要实现JS调用OC方法,除了拦截URL之外,还有一种简单的方式.那就是利用WKWebView的新特性MessageHandler来实现JS调用原生方法. Messa ...

  4. Java EE 之 过滤器入门学习与总结(2)

    今天就对使用Filter技术能做什么来个小小的归纳.也为了方便今后的复习. 控制浏览器不进行对jsp页面的缓存 //在doFilter方法中添加这样的代码 HttpServletRequest req ...

  5. 怎么避免在类实现的cpp文件中不要多次进行类声明

    方法1: 类的头文件中写 #pragma once class MyTeacher { public: MyTeacher(); ~MyTeacher(); }; 方法2: 类的头文件中写 #ifnd ...

  6. ROS_Kinetic_07 ROS中机器人三维物理引擎高保真仿真利器gazebo 7.0

    ROS_Kinetic_07 ROS中机器人三维物理引擎高保真仿真利器gazebo 7.0 ROS kinetic中的gazebo版本是7.0,有很多新的特性. 首先,启动gazebo: ~$ gaz ...

  7. OC利用ijkplayer框架按照步骤集成实现电视直播

    一. 下载ijkplayer ijkplayer下载地址:https://github.com/Bilibili/ijkplayer 下载完成后解压, 解压后文件夹内部目录如下图: ijkplayer ...

  8. unity使用UGUI创建摇杆

    1.现在unity做一个项目,各种插件各种包,于是项目资源就无限变大了,其实一些简单的功能可以自己写,这里就是试着使用UGUI编写一个摇杆功能 2.脚本如下: using UnityEngine; u ...

  9. C 语言内存区域分配(进程的各个段)详解

    C语言可执行代码结构  名称 内容 代码段  可执行代码.字符串常量 数据段  已初始化全局变量.已初始化全局静态变量.局部静态变量.常量数据 BSS段  未初始化全局变量,未初始化全局静态变量 栈 ...

  10. Linux管道编程实例

    /*管道 可以把管道想象为两个实体之间的单向连接器.注意,管道是半双工的, 如果需要全双工通讯,应该转而考虑套接字. 匿名管道又称管道,提供了一个进程与它的兄弟进程通讯的方法,只存在于父进程中: 命名 ...