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





目录
相关文章
|
20天前
|
机器学习/深度学习 算法 PyTorch
基于图神经网络的大语言模型检索增强生成框架研究:面向知识图谱推理的优化与扩展
本文探讨了图神经网络(GNN)与大型语言模型(LLM)结合在知识图谱问答中的应用。研究首先基于G-Retriever构建了探索性模型,然后深入分析了GNN-RAG架构,通过敏感性研究和架构改进,显著提升了模型的推理能力和答案质量。实验结果表明,改进后的模型在多个评估指标上取得了显著提升,特别是在精确率和召回率方面。最后,文章提出了反思机制和教师网络的概念,进一步增强了模型的推理能力。
50 4
基于图神经网络的大语言模型检索增强生成框架研究:面向知识图谱推理的优化与扩展
|
7天前
|
运维 供应链 安全
阿里云先知安全沙龙(武汉站) - 网络空间安全中的红蓝对抗实践
网络空间安全中的红蓝对抗场景通过模拟真实的攻防演练,帮助国家关键基础设施单位提升安全水平。具体案例包括快递单位、航空公司、一线城市及智能汽车品牌等,在演练中发现潜在攻击路径,有效识别和防范风险,确保系统稳定运行。演练涵盖情报收集、无差别攻击、针对性打击、稳固据点、横向渗透和控制目标等关键步骤,全面提升防护能力。
|
29天前
|
机器学习/深度学习 人工智能 算法
深入解析图神经网络:Graph Transformer的算法基础与工程实践
Graph Transformer是一种结合了Transformer自注意力机制与图神经网络(GNNs)特点的神经网络模型,专为处理图结构数据而设计。它通过改进的数据表示方法、自注意力机制、拉普拉斯位置编码、消息传递与聚合机制等核心技术,实现了对图中节点间关系信息的高效处理及长程依赖关系的捕捉,显著提升了图相关任务的性能。本文详细解析了Graph Transformer的技术原理、实现细节及应用场景,并通过图书推荐系统的实例,展示了其在实际问题解决中的强大能力。
155 30
|
10天前
|
存储 监控 安全
网络安全视角:从地域到账号的阿里云日志审计实践
日志审计的必要性在于其能够帮助企业和组织落实法律要求,打破信息孤岛和应对安全威胁。选择 SLS 下日志审计应用,一方面是选择国家网络安全专用认证的日志分析产品,另一方面可以快速帮助大型公司统一管理多组地域、多个账号的日志数据。除了在日志服务中存储、查看和分析日志外,还可通过报表分析和告警配置,主动发现潜在的安全威胁,增强云上资产安全。
|
2月前
|
人工智能 自然语言处理
WebDreamer:基于大语言模型模拟网页交互增强网络规划能力的框架
WebDreamer是一个基于大型语言模型(LLMs)的网络智能体框架,通过模拟网页交互来增强网络规划能力。它利用GPT-4o作为世界模型,预测用户行为及其结果,优化决策过程,提高性能和安全性。WebDreamer的核心在于“做梦”概念,即在实际采取行动前,用LLM预测每个可能步骤的结果,并选择最有可能实现目标的行动。
65 1
WebDreamer:基于大语言模型模拟网页交互增强网络规划能力的框架
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络(CNN): 从理论到实践
本文将深入浅出地介绍卷积神经网络(CNN)的工作原理,并带领读者通过一个简单的图像分类项目,实现从理论到代码的转变。我们将探索CNN如何识别和处理图像数据,并通过实例展示如何训练一个有效的CNN模型。无论你是深度学习领域的新手还是希望扩展你的技术栈,这篇文章都将为你提供宝贵的知识和技能。
309 7
|
2月前
|
数据采集 XML 存储
构建高效的Python网络爬虫:从入门到实践
本文旨在通过深入浅出的方式,引导读者从零开始构建一个高效的Python网络爬虫。我们将探索爬虫的基本原理、核心组件以及如何利用Python的强大库进行数据抓取和处理。文章不仅提供理论指导,还结合实战案例,让读者能够快速掌握爬虫技术,并应用于实际项目中。无论你是编程新手还是有一定基础的开发者,都能在这篇文章中找到有价值的内容。
|
2月前
|
云安全 监控 安全
云计算环境下的网络安全策略与实践
在数字化时代,云计算已成为企业和个人存储、处理数据的重要方式。然而,随着云服务的普及,网络安全问题也日益凸显。本文将探讨如何在云计算环境中实施有效的网络安全措施,包括加密技术、访问控制、安全监控和应急响应计划等方面。我们将通过具体案例分析,展示如何在实际场景中应用这些策略,以保护云中的数据不受威胁。
|
2月前
|
JSON 数据处理 Swift
Swift 中的网络编程,主要介绍了 URLSession 和 Alamofire 两大框架的特点、用法及实际应用
本文深入探讨了 Swift 中的网络编程,主要介绍了 URLSession 和 Alamofire 两大框架的特点、用法及实际应用。URLSession 由苹果提供,支持底层网络控制;Alamofire 则是在 URLSession 基础上增加了更简洁的接口和功能扩展。文章通过具体案例对比了两者的使用方法,帮助开发者根据需求选择合适的网络编程工具。
37 3
|
2月前
|
开发框架 Dart Android开发
安卓与iOS的跨平台开发:Flutter框架深度解析
在移动应用开发的海洋中,Flutter作为一艘灵活的帆船,正引领着开发者们驶向跨平台开发的新纪元。本文将揭开Flutter神秘的面纱,从其架构到核心特性,再到实际应用案例,我们将一同探索这个由谷歌打造的开源UI工具包如何让安卓与iOS应用开发变得更加高效而统一。你将看到,借助Flutter,打造精美、高性能的应用不再是难题,而是变成了一场创造性的旅程。