Android异步加载解决方案

来源:互联网 发布:solidworks软件画足球 编辑:程序博客网 时间:2024/06/01 07:48

Android的Lazy  Load主要体现在网络数据(图片)异步加载、数据库查询、复杂业务逻辑处理以及费时任务操作导致的异步处理等方面。Android开发过程中,异步处理是最常见的技术问题。

Android应用开发过程中必须遵循单线程模型(Single  Thread  Model)的原则。因为Android的UI线程操作并不是安全的,所以设计UI的操作必须在UI线程中完成。但是并非所有的操作都能在主线程中进行,Google工程师在设计上约定,Android应用在5s内无响应的话会导致ANR(Application  Not  Response),这就要求开发者必须遵循两条法则:1、不能阻塞UI线程,2、确保只在UI线程中访问UI工具包。于是,开启子线程进行一步处理的技术方案应运而生。


一、采用AsyncTask

AsyncTask简介:AsyncTask的特点是任务在主线程之外运行,而回调方法是在主线程中执行,有效的避免了Handler带来的麻烦。阅读AsyncTask源码可知,AsyncTask是使用java.util.concurrent框架来管理县城以及人物的执行的,concurrent框架是一个非常成熟、高效的框架。这说明AsyncTask的设计很好的解决了匿名线程存在的问题。

AsyncTask是抽象类,AsyncTask定义了三中泛型类型:Params,Progress和Result。Params:启动任务执行输入的参数,比如HTTP请求的URL。Progress:后台任务执行的百分比。Result:后台任务最终返回的结果,比如String。子类必须实现抽象方法doInBackground(Params... p),再此方法中实现任务的执行工作,比如连接网络获取数据等。通常还应该实现onPostExecute(Result r)方法,因为应用程序执行的结果在此方法中返回。需要注意的是AsyncTask一定要在主线程中创建实例。

AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,开发者需要实现这些方法.,在任务执行过程中,这些方法被自动调用。onPreExecute():当任务执行之前开始调用此方法,可以在这里显示进度对话框。doInBackground(Params...):此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress...)来更新任务的进度。onProgressUpdate(Progress...):此方法在主线程执行,用于显示任务执行的进度。onPostExecute(Result)此方法在主线程执行,任务执行的结果作为此方法的参数返回。


二、采用Thread + Handler + Message

Handler简介:Handler为Android提供了一种异步消息处理机制,它包含两个队列,一个是线程队列,另一个是消息队列。

使用post方法将线程添加到线程队列中,使用sendMessage(Message  msg)将消息放入消息队列中。当向消息队列中发送消息后就立即返回,而从消息队列中读取消息对象实会阻塞,继而回调Handler中public  void  handleMessage(Message  msg)方法。因此,在创建Handler是应使用匿名内部类重写该方法。如果想要这个流程一直执行的话,可以再用run方法内部执行postDelay或者post方法,再将该线程对象添加到消息队列中重复执行。想要停止线程,调用Handler对象的removeCallbacks(Runnabla  r)从线程队列中移除对象,使线程停止。


三、采用Thread + Handler + post方法

使用post方法将Runnable对象放到Handler的线程队列中,该Runnable的执行方法并未单独开启线程,仍然在当前Activity的UI纤尘不染中执行,Handler只是调用了Runnable对象的run方法。


综上所述,我们可以看出,Android  API中AsyncTask对于与不处理不是万能的,对于需要循环、多次的任务处理,我们仍然需要采取传统的Thread线程机制。

原创粉丝点击