Android网络请求框架之Retrofit实践

简介: <p><span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">网络访问框架经过了从使用最原始的AsyncTask构建简单的网络访问框架(甚至不能称为框架),后来使用开源的android-async-http库,再到使用google发布的volley库,一直不懈的寻找更好的解

网络访问框架经过了从使用最原始的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.   
  3. import com.micky.retrofitrxandroiddagger2.data.api.response.GetIpInfoResponse;  
  4.   
  5. import retrofit.Call;  
  6. import retrofit.http.GET;  
  7. import retrofit.http.Query;  
  8. import rx.Observable;  
  9.   

  10. public interface ApiService {  
  11.     @GET("service/getIpInfo.php")  
  12.     Call<GetIpInfoResponse> getIpInfo(@Query("ip") String ip);  
  13. }  

3、定义接收数据的response

[java]  view plain  copy
  1. package com.micky.retrofitrxandroiddagger2.data.api.response;  
  2.   
  3.   
  4. import com.micky.retrofitrxandroiddagger2.data.api.model.IpInfo;  

  5. public class GetIpInfoResponse extends BaseResponse {  
  6.     public IpInfo data;  
  7. }  

4、请求数据并显示

[java]  view plain  copy
  1. package com.micky.retrofitrxandroiddagger2;  
  2.   
  3. import android.os.Bundle;  
  4. import android.support.design.widget.FloatingActionButton;  
  5. import android.support.v7.app.AppCompatActivity;  
  6. import android.support.v7.widget.Toolbar;  
  7. import android.view.View;  
  8. import android.view.Menu;  
  9. import android.view.MenuItem;  
  10. import android.widget.ProgressBar;  
  11. import android.widget.TextView;  
  12. import android.widget.Toast;  
  13.   
  14. import com.micky.retrofitrxandroiddagger2.common.utils.CrashHandler;  
  15. import com.micky.retrofitrxandroiddagger2.data.api.ApiService;  
  16. import com.micky.retrofitrxandroiddagger2.data.api.response.GetIpInfoResponse;  
  17.   
  18. import retrofit.Call;  
  19. import retrofit.Callback;  
  20. import retrofit.GsonConverterFactory;  
  21. import retrofit.Response;  
  22. import retrofit.Retrofit;  
  23. import retrofit.RxJavaCallAdapterFactory;  
  24. import rx.Subscriber;  
  25. import rx.android.schedulers.AndroidSchedulers;  
  26. import rx.functions.Action1;  
  27. import rx.schedulers.Schedulers;  
  28.   

  29. public class MainActivity extends AppCompatActivity {  
  30.   
  31.     private static final String ENDPOINT = "http://ip.taobao.com";  
  32.     private TextView mTvContent;  
  33.     private ProgressBar mProgressBar;  
  34.   
  35.     @Override  
  36.     protected void onCreate(Bundle savedInstanceState) {  
  37.         super.onCreate(savedInstanceState);  
  38.         setContentView(R.layout.activity_main);  
  39.         Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);  
  40.         setSupportActionBar(toolbar);  
  41.         mTvContent = (TextView) findViewById(R.id.tv_content);  
  42.         mProgressBar = (ProgressBar) findViewById(R.id.progress_bar);  
  43.   
  44.         FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);  
  45.         fab.setOnClickListener(new View.OnClickListener() {  
  46.             @Override  
  47.             public void onClick(View view) {  
  48.   
  49.                 Retrofit retrofit = new Retrofit.Builder()  
  50.                         .baseUrl(ENDPOINT)  
  51.                         .addConverterFactory(GsonConverterFactory.create())  
  52.                         .build();  
  53.                 ApiService apiService = retrofit.create(ApiService.class);  
  54.   
  55.                 mProgressBar.setVisibility(View.VISIBLE);  
  56.   
  57.                 Call<GetIpInfoResponse> call = apiService.getIpInfo("63.223.108.42");  
  58.                 call.enqueue(new Callback<GetIpInfoResponse>() {  
  59.                     @Override  
  60.                     public void onResponse(Response<GetIpInfoResponse> response, Retrofit retrofit) {  
  61.                         mProgressBar.setVisibility(View.GONE);  
  62.                         GetIpInfoResponse getIpInfoResponse = response.body();  
  63.                         mTvContent.setText(getIpInfoResponse.data.country);  
  64.                     }  
  65.   
  66.                     @Override  
  67.                     public void onFailure(Throwable t) {  
  68.                         mProgressBar.setVisibility(View.GONE);  
  69.                         mTvContent.setText(t.getMessage());  
  70.                     }  
  71.                 });  
  72.             }  
  73.         });  
  74.     }  
  75.   
  76.     @Override  
  77.     public boolean onCreateOptionsMenu(Menu menu) {  
  78.         getMenuInflater().inflate(R.menu.menu_main, menu);  
  79.         return true;  
  80.     }  
  81.   
  82.     @Override  
  83.     public boolean onOptionsItemSelected(MenuItem item) {  
  84.         int id = item.getItemId();  
  85.         if (id == R.id.action_settings) {  
  86.             return true;  
  87.         }  
  88.   
  89.         return super.onOptionsItemSelected(item);  
  90.     }  
  91. }  





目录
相关文章
|
27天前
|
缓存 搜索推荐 Android开发
安卓开发中的自定义控件实践
【10月更文挑战第4天】在安卓开发的海洋中,自定义控件是那片璀璨的星辰。它不仅让应用界面设计变得丰富多彩,还提升了用户体验。本文将带你探索自定义控件的核心概念、实现过程以及优化技巧,让你的应用在众多竞争者中脱颖而出。
|
1天前
|
算法 JavaScript Android开发
|
2天前
|
数据采集 存储 XML
Python实现网络爬虫自动化:从基础到实践
本文将介绍如何使用Python编写网络爬虫,从最基础的请求与解析,到自动化爬取并处理复杂数据。我们将通过实例展示如何抓取网页内容、解析数据、处理图片文件等常用爬虫任务。
|
30天前
|
弹性计算 人工智能 运维
Terraform从入门到实践:快速构建你的第一张业务网络(上)
本次分享主题为《Terraform从入门到实践:快速构建你的第一张业务网络》。首先介绍如何入门和实践Terraform,随后演示如何使用Terraform快速构建业务网络。内容涵盖云上运维挑战及IaC解决方案,并重磅发布Terraform Explorer产品,旨在降低使用门槛并提升用户体验。此外,还将分享Terraform在实际生产中的最佳实践,帮助解决云上运维难题。
115 1
Terraform从入门到实践:快速构建你的第一张业务网络(上)
|
10天前
|
Java 程序员 API
Android|集成 slf4j + logback 作为日志框架
做个简单改造,统一 Android APP 和 Java 后端项目打印日志的体验。
37 1
|
17天前
|
机器学习/深度学习 人工智能 监控
深入理解深度学习中的卷积神经网络(CNN):从原理到实践
【10月更文挑战第14天】深入理解深度学习中的卷积神经网络(CNN):从原理到实践
55 1
|
24天前
|
机器学习/深度学习 存储 自然语言处理
从理论到实践:如何使用长短期记忆网络(LSTM)改善自然语言处理任务
【10月更文挑战第7天】随着深度学习技术的发展,循环神经网络(RNNs)及其变体,特别是长短期记忆网络(LSTMs),已经成为处理序列数据的强大工具。在自然语言处理(NLP)领域,LSTM因其能够捕捉文本中的长期依赖关系而变得尤为重要。本文将介绍LSTM的基本原理,并通过具体的代码示例来展示如何在实际的NLP任务中应用LSTM。
54 4
|
28天前
|
自动驾驶 物联网 5G
5G网络的演进:从理论到实践
【10月更文挑战第3天】5G网络作为新一代移动通信技术,不仅在理论上实现了重大突破,而且在实践中也展现出了强大的生命力。本文将围绕5G网络的演进,从理论基础到实际应用,探讨5G技术的发展和实践案例,同时提供代码示例以供参考。
75 6
|
27天前
|
前端开发 搜索推荐 Android开发
安卓开发中的自定义控件实践
【10月更文挑战第4天】在安卓开发的世界里,自定义控件如同画家的画笔,能够绘制出独一无二的界面。通过掌握自定义控件的绘制技巧,开发者可以突破系统提供的界面元素限制,创造出既符合品牌形象又提供卓越用户体验的应用。本文将引导你了解自定义控件的核心概念,并通过一个简单的例子展示如何实现一个基本的自定义控件,让你的安卓应用在视觉和交互上与众不同。
|
18天前
|
机器学习/深度学习 算法 数据建模
计算机前沿技术-人工智能算法-生成对抗网络-算法原理及应用实践
计算机前沿技术-人工智能算法-生成对抗网络-算法原理及应用实践
21 0