在互联网驱动的世界中,移动应用程序需要从其产品的后端(例如,从数据库)以及第三方来源(例如Facebook和Twitter)共享和接收信息,并且这些交互通常是通过RESTfulAPI。当请求数量增加时,如何生成这些请求对开发来说变得非常关键,因为获取数据的方式确实会影响应用程序的用户体验。同步请求保持空闲直到服务器响应的行为,同步请求可防止接口增加计算时间并使移动应用程序无响应。于是出现了异步请求,当客户端向服务器发出请求时,服务器将请求分派给事件处理程序,注册回调并进行下一个请求,当响应可用时,将结果响应给客户端.这是一种更好的方法,因为异步请求允许独立执行任务。上图显示了两种编程方法在客户端-服务器模型中的不同之处。在Android中,UI线程(通常称为主线程)基于与异步编程相同的原则。AndroidUI工具包不是线程安全的,如果工作线程(执行进行网络调用的任务)更新AndroidUI工具包,可能会导致未定义和意外的行为,追踪起来既困难又耗时。单线程模型保证了UI不会被不同的线程同时修改,所以如果我们用一张来自网络的图片来更新ImageView,工作线程会在一个单独的线程中进行网络操作,而ImageView会由UI线程更新,确保操作是线程安全的。UI线程提供必要的同步,并且它还有助于UI线程始终是非阻塞的,因为实际工作发生在辅助线程的后台。总之,在Android开发中遵循两个简单的规则:UI线程不应该被阻塞。不应直接从非UI工作线程更新UI工具包。在Android应用程序中,如果您需要在用户与应用程序交互时在主线程之外执行工作,最好使用AsyncTask或Volley等网络库。以下是使用AsyncTask实现异步工作线程的方法:AsyncTask的子类实现了onPreExecute()方法,该方法将创建一个toast消息,指示网络调用即将发生。实现doInBackground(Params...)方法,顾名思义,doInBackground是工作线程进行网络调用并保持主线程空闲。由于工作线程无法直接更新UI,我实现了自己的postExecute(Result)方法,该方法将提供网络调用的结果并在UI线程中运行,以便可以安全地修改UI。后台任务的进度可以使用publishProgress()方法从工作线程发布,并且可以使用onProgressUpdate(Progress...)方法在UI线程上更新。***,在UI线程中使用execute()方法调用异步任务。让我们继续深入了解Volley:Volley运行一个缓存处理线程和一个网络调度线程池。网络调用请求首先由缓存线程排序。如果可以从缓存中获取响应,则缓存的响应将由CacheDispatche解析并传递回主UI线程。如果结果在缓存中不可用,则需要网络请求来获取所需的数据,并且该请求将被放入网络队列中。第一个可用的网络线程(NetworkDispatcher)从队列中获取请求,然后执行HTTP请求,在工作线程上解析响应并将响应写入缓存。然后它将解析的响应传递回主线程。总结:Android中的UI线程或者说主线程,完成了向UI工具包派发事件的工作,并负责从消息队列中取出请求,通知widgets采取行动,这就是为什么UI线程始终处于非阻塞性。Android有自己的HTTP客户端库,例如HttpURLConnection可以帮助您执行同步网络调用。为了防止主线程阻塞,需要在后台运行的工作线程中执行网络调用。Android的AsyncTask库有助于在后台运行任务并确保主线程是非阻塞的。它还确保后台任务不会直接更新UI,而是将结果返回给UI线程。AsyncTask有其局限性,例如无法缓存处理并行请求的响应,并且在后台任务运行时无法正确处理屏幕旋转。使用Volley进行异步网络调用是开发Android应用程序的更简洁的解决方案。Volley具有一系列强大的功能,例如缓存、请求取消和优先级排序。Volley可以处理JSON、图片、文本等多种请求类型,性能优于AsyncTask。
