网络访问框架经过了从使用最原始的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. Java多线程模型

    谈到Java多线程就涉及到多线程的模型及Java线程与底层操作系统之间的关系.正如我们熟知,现代机器可以分为硬件和软件两大块,如图2-5-1-1,硬件是基础,软件提供实现不同功能的手段.而且软件可以分 ...

  2. 协议系列之IP协议

    1.协议 协议(protocol)的定义:为计算机网络中进行数据交换而建立的规则.标准或约定的集合.两个终端相互通信时双方达成的一种约定,规定了一套通信规则,双方通信必须遵守这些规则.这些规则规定了分 ...

  3. Linux Java开发坏境搭建,Ubuntu-jdk+tomcat+eclipse+svn 包安装详细操作

    更新时间2015-03-15 更新2015-04-12 svn安装更新 第一步 安装jdk (在linux上使用yum安装JDK  http://blog.chinaunix.net/uid-1546 ...

  4. 剑指offer面试题3 二维数组中的查找(c)

    剑指offer面试题三:

  5. JDBC数据库连接简介(一)

    jdbc的由来 odbc(open database connection) 最初各个数据库比如mysql和oracle等,虽然都支持sql,但是他们的连接方式是不一样的,需要按照相应的api来编写不 ...

  6. TBschedule入门

    tbschedule 淘宝的wiki: http://code.taobao.org/p/tbschedule/wiki/index/ 截取内容如下: 此文档内部包括: 1.设计目标说明 2.主要概念 ...

  7. antlr v4 使用指南连载4——词法规则入门之黄金定律

    词法规则入门 黄金定律一二 若输入串能被多个词法规则匹配,那么声明在词法文件最前面的规则生效. parser parser grammar HelloParser; options { languag ...

  8. Java五道输出易错题解析(进来挑战下)

    转自:http://blog.csdn.net/lanxuezaipiao/article/details/41985243 收集了几个易错的或好玩的Java输出题,分享给大家,以后在编程学习中稍微注 ...

  9. Git Bash+EGit在项目中配合使用最常用方法总结(根据场景使用)

    最近在项目中使用Git进行代码管理,之前一直用SVN进行管理,现在谈一谈Git在项目中如何与EGit插件配合使用,高效同步开发. 使用过SVN一段时间的人,初识Git一定感觉很别扭,发现会遇到各种各样 ...

  10. 【一天一道LeetCode】#119. Pascal's Triangle II

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...