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. }  





目录
相关文章
|
15天前
|
安全 Android开发 Kotlin
Android经典实战之SurfaceView原理和实践
本文介绍了 `SurfaceView` 这一强大的 UI 组件,尤其适合高性能绘制任务,如视频播放和游戏。文章详细讲解了 `SurfaceView` 的原理、与 `Surface` 类的关系及其实现示例,并强调了使用时需注意的线程安全、生命周期管理和性能优化等问题。
52 7
|
3天前
|
存储 监控 安全
网络安全与信息安全:保护数据的重要性与实践措施
本文深入探讨了网络安全和信息安全领域内的关键概念,包括网络漏洞、加密技术以及安全意识的重要性。通过分析这些要素,文章提供了实用的策略来增强个人和企业的数据保护能力。我们将探讨如何识别和防范潜在的网络威胁,并强调了持续更新安全知识和采取预防措施的必要性。
|
10天前
|
缓存 搜索推荐 Android开发
安卓应用开发中的自定义View组件实践
【9月更文挑战第10天】在安卓开发领域,自定义View是提升用户体验和实现界面个性化的重要手段。本文将通过一个实际案例,展示如何在安卓项目中创建和使用自定义View组件,包括设计思路、实现步骤以及可能遇到的问题和解决方案。文章不仅提供了代码示例,还深入探讨了自定义View的性能优化技巧,旨在帮助开发者更好地掌握这一技能。
|
13天前
|
云安全 安全 网络安全
云计算环境下的网络安全策略与实践
【9月更文挑战第6天】在数字化浪潮中,云计算已成为企业转型和创新的强大引擎。随之而来的网络安全挑战亦日益突出,成为制约云服务发展的关键因素。本文深入探讨了云计算环境中的安全风险,并提出了一系列切实可行的网络安全策略。从基础的数据加密到高级的身份验证机制,再到细致的访问控制和入侵检测系统的应用,我们细致勾勒出一幅全面的云计算安全蓝图。通过实例分析,文章揭示了安全策略在实际场景中的应用效果,并对未来云计算安全的发展趋势进行了前瞻性的预测。旨在为云计算服务提供商和用户双方提供指导,共同构筑更为坚固的网络安全防线。
|
11天前
|
机器学习/深度学习 数据采集 数据可视化
深度学习实践:构建并训练卷积神经网络(CNN)对CIFAR-10数据集进行分类
本文详细介绍如何使用PyTorch构建并训练卷积神经网络(CNN)对CIFAR-10数据集进行图像分类。从数据预处理、模型定义到训练过程及结果可视化,文章全面展示了深度学习项目的全流程。通过实际操作,读者可以深入了解CNN在图像分类任务中的应用,并掌握PyTorch的基本使用方法。希望本文为您的深度学习项目提供有价值的参考与启示。
|
16天前
|
监控 安全 网络安全
云计算与网络安全的融合之路:探索云服务中的信息安全实践
【9月更文挑战第3天】在数字化转型的浪潮中,云计算已成为现代企业不可或缺的技术基石。然而,随着数据和应用逐渐迁移至云端,网络安全和信息安全的挑战亦随之升级。本文将深入探讨云计算环境下的网络安全挑战,并分享如何通过策略和技术手段加强云服务的安全防护,确保企业资产与数据的完整性、可用性和保密性。
34 5
|
14天前
|
安全 算法 网络安全
网络安全与信息安全:知识分享与实践
本文将深入探讨网络安全漏洞、加密技术和安全意识等方面的知识。我们将分析常见的网络攻击方式,如病毒、木马和黑客攻击,并介绍如何通过防火墙、入侵检测系统等技术手段来防止这些攻击。同时,我们还将讨论密码学在保护数据安全中的重要性,包括对称加密、非对称加密和哈希函数等概念。最后,我们将强调提高个人和组织的安全意识的重要性,包括定期更新软件、使用强密码和多因素认证等措施。
|
20天前
|
测试技术 数据库
探索JSF单元测试秘籍!如何让您的应用更稳固、更高效?揭秘成功背后的测试之道!
【8月更文挑战第31天】在 JavaServer Faces(JSF)应用开发中,确保代码质量和可维护性至关重要。本文详细介绍了如何通过单元测试实现这一目标。首先,阐述了单元测试的重要性及其对应用稳定性的影响;其次,提出了提高 JSF 应用可测试性的设计建议,如避免直接访问外部资源和使用依赖注入;最后,通过一个具体的 `UserBean` 示例,展示了如何利用 JUnit 和 Mockito 框架编写有效的单元测试。通过这些方法,不仅能够确保代码质量,还能提高开发效率和降低维护成本。
34 0
|
20天前
|
自然语言处理 C# 开发者
Uno Platform多语言开发秘籍大公开:轻松驾驭全球用户,一键切换语言,让你的应用成为跨文化交流的桥梁!
【8月更文挑战第31天】Uno Platform 是一个强大的开源框架,允许使用 C# 和 XAML 构建跨平台的原生移动、Web 和桌面应用程序。本文详细介绍如何通过 Uno Platform 创建多语言应用,包括准备工作、设置多语言资源、XAML 中引用资源、C# 中加载资源以及处理语言更改。通过简单的步骤和示例代码,帮助开发者轻松实现应用的国际化。
28 0
|
20天前
|
缓存 Android开发 UED
安卓应用开发中的性能优化实践
【8月更文挑战第31天】在安卓的世界里,性能是王道。本文将带你深入理解如何通过代码优化和工具使用来提升你的安卓应用性能。我们将一起探索内存管理、布局优化、多线程处理等关键领域,并配以实用的代码示例,让你的应用飞一般地运行起来!