如何优化Android异步请求服务器数据?

栏目: Android · 发布时间: 6年前

内容简介:在互联网驱动的世界中,移动应用程序需要共享和接收来自其产品的后端(例如,来自数据库)以及来自第三方来源(如Facebook和Twitter)的信息,这些交互通常通过RESTful API进行。当请求数量增加时,这些请求的生成方式对于开发变得非常关键,因为获取数据的方式确实会影响应用程序的用户体验。同步请求的行为在服务器响应之前保持空闲状态,同步请求会阻止接口增加计算时间并使移动应用程序无响应。于是就异步请求出现,当客户端向服务器发出请求时,服务器将请求分派给事件处理程序,注册回调并继续执行下一个请求,当响

在互联网驱动的世界中,移动应用程序需要共享和接收来自其产品的后端(例如,来自数据库)以及来自第三方来源(如Facebook和Twitter)的信息,这些交互通常通过RESTful API进行。当请求数量增加时,这些请求的生成方式对于开发变得非常关键,因为获取数据的方式确实会影响应用程序的用户体验。

如何优化Android异步请求服务器数据?

同步请求的行为在服务器响应之前保持空闲状态,同步请求会阻止接口增加计算时间并使移动应用程序无响应。于是就异步请求出现,当客户端向服务器发出请求时,服务器将请求分派给事件处理程序,注册回调并继续执行下一个请求,当响应可用时,将使用结果响应客户端。这是一种更好的方法,因为异步请求允许独立执行任务。

如何优化Android异步请求服务器数据?

上图显示了两种编程方法在客户端 - 服务器模型中的不同之处。在Android中,UI线程(通常称为主线程)是基于与异步编程相同的原理。

Android UI工具包不是线程安全的,如果工作线程(执行进行网络调用的任务)更新Android UI工具包,则可能导致未定义和意外的行为,追踪这可能是困难且耗时的。单线程模型确保UI不会同时被不同的线程修改,因此,如果我们使用来自网络的图像更新ImageView,则工作线程将在单独的线程中执行网络操作,而ImageView将由UI线程更新,这可确保操作是线程安全的。UI线程提供必要的同步,它还有助于UI线程始终是非阻塞的,因为实际任务在工作线程的后台发生的。

总之,请遵循Android开发中的两个简单规则:

  • 不应阻止UI线程。
  • 不应从非UI工作线程直接更新UI工具包。

在Android应用如果您需要在用户与应用程序交互时在主线程之外执行工作,最好使用AsyncTask或Volley等网络库。

以下是使用AsyncTask实现异步工作线程的方法:

  1. Subclass AsyncTask实现该onPreExecute()方法,它将创建一个toast消息,表明网络调用即将发生。
  2. 实施doInBackground(Params...)方法,顾名思义,doInBackground是工作线程进行网络调用并保持主线程免费。
  3. 由于工作线程无法直接更新UI,因此我实现了自己的postExecute(Result)方法,该方法将从网络调用中提供结果并在UI线程中运行,以便可以安全地修改用户界面。
  4. 后台任务的进度可以使用该publishProgress()方法从工作线程发布,并且可以使用该onProgressUpdate(Progress...)方法在UI线程上更新。
  5. 最后,使用execute()UI线程中的方法调用异步任务。

让我们进一步继续了解Volley:

  1. Volley运行一个缓存处理线程和一个网络分派线程池。
  2. 网络调用请求首先由缓存线程进行分类。如果响应可以从缓存中提供,则缓存的响应将被解析CacheDispatche并传递回主线程UI线程。
  3. 如果结果在缓存中不可用,则需要进行网络请求以获取所需数据,请求将放入网络队列中。
  4. 第一个可用的网络线程(NetworkDispatcher)从队列中获取请求,然后,它执行HTTP请求,解析工作线程上的响应并将响应写入缓存。然后它将解析后的响应传递回主线程。

如何优化Android异步请求服务器数据?

​总结:

  • Android中的UI线程或主线程执行将事件分派给UI工具包的工作,并负责将消息队列中的请求出列以通知窗口小部件采取操作,这就是为什么UI线程始终是非阻塞的重要性。
  • Android有自己的HTTP客户端库,例如HttpURLConnection它可以帮助您执行同步网络调用。为了保持主线程不阻塞,需要在后台运行的工作线程中执行网络调用。
  • Android的AsyncTask库可以帮助在后台运行任务,并确保主线程是非阻塞的。它还确保后台任务不直接更新UI,相反,它将结果返回到UI线程。
  • AsyncTask有其局限性,例如无法缓存响应而无法处理并行请求,当后台任务运行时,它也不能正常处理屏幕旋转等场景。
  • 使用Volley进行异步网络调用是开发Android应用程序的更简洁的解决方案,Volley拥有一系列强大的功能,例如缓存,请求取消和优先级排序。
  • Volley可以处理多种请求类型,例如JSON,图像和文本,并且它比AsyncTask表现更好。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

MySQL技术内幕

MySQL技术内幕

姜承尧 / 机械工业出版社 / 2013-5 / 79.00元

《MySQL技术内幕:InnoDB存储引擎(第2版)》由国内资深MySQL专家亲自执笔,国内外多位数据库专家联袂推荐。作为国内唯一一本关于InnoDB的专著,《MySQL技术内幕:InnoDB存储引擎(第2版)》的第1版广受好评,第2版不仅针对最新的MySQL 5.6对相关内容进行了全面的补充,还根据广大读者的反馈意见对第1版中存在的不足进行了完善,《MySQL技术内幕:InnoDB存储引擎(第2......一起来看看 《MySQL技术内幕》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具