异步加载(AsyncTask)的用法

原创 2016年08月30日 08:24:21

 在开发Android应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。在单线程模型中始终要记住两条法则: 
1. 不要阻塞UI线程 
2. 确保只在UI线程中访问Android UI工具包 
      当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。所以主线程通常又被叫做UI线程。 
      比如说从网上获取一个网页,在一个TextView中将其源代码显示出来,这种涉及到网络操作的程序一般都是需要开一个线程完成网络访问,但是在获得页面源码后,是不能直接在网络操作线程中调用TextView.setText()的.因为其他线程中是不能直接访问主UI线程成员 。

android提供了几种在其他线程中访问UI线程的方法。 
Activity.runOnUiThread( Runnable ) 
View.post( Runnable ) 
View.postDelayed( Runnable, long ) 
Hanlder 
这些类或方法同样会使你的代码很复杂很难理解。然而当你需要实现一些很复杂的操作并需要频繁地更新UI时这会变得更糟糕。 

     为了解决这个问题,Android 1.5提供了一个工具类:AsyncTask,它使创建需要与用户界面交互的长时间运行的任务变得更简单。相对来说AsyncTask更轻量级一些,适用于简单的异步处理,不需要借助线程和Handler即可实现。 
AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Params,Progress和Result。 
  Params 启动任务执行的输入参数,比如HTTP请求的URL。 
  Progress 后台任务执行的百分比。 
  Result 后台执行任务最终返回的结果,比如String。 

     AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。 
  1) 子类化AsyncTask 
  2) 实现AsyncTask中定义的下面一个或几个方法 
     onPreExecute(), 该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条。 
    doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台计算工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。 
    onProgressUpdate(Progress...),在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。 
    onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread. 

为了正确的使用AsyncTask类,以下是几条必须遵守的准则: 
  1) Task的实例必须在UI thread中创建 
  2) execute方法必须在UI thread中调用 
  3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法 
  4) 该task只能被执行一次,否则多次调用时将会出现异常 
      doInBackground方法和onPostExecute的参数必须对应,这两个参数在AsyncTask声明的泛型参数列表中指定,第一个为doInBackground接受的参数,第二个为显示进度的参数,第三个为doInBackground返回和onPostExecute传入的参数。

版权声明:本文为博主原创文章,未经博主允许不得转载。

使用AsyncTask异步加载图片

主要看看AyncTask如何使用: MainActivity.java [java] view plaincopyprint? public class MainActivity ...
  • shineflowers
  • shineflowers
  • 2014年12月05日 13:28
  • 3962

使用AsyncTask异步更新UI界面(加载网络图片)

使用AsyncTask异步获取网络图片,简单介绍AsyncTask的用法
  • luzhenyuxfcy
  • luzhenyuxfcy
  • 2015年09月22日 10:19
  • 849

异步加载网络图片(多线程,和AsyncTask)

下面实现一个异步加载网络图片的例子,加载的图片使用ListIView显示出来 异步加载图片有两种方式,多线程,和AsyncTask,其实大家都知道AsyncTask底层也是多线程来实现的 第一步。...
  • wei_chong_chong
  • wei_chong_chong
  • 2016年03月13日 21:27
  • 841

Android异步加载学习笔记之一:用AsyncTask加载服务器json数据

我们知道在Android开发中,UI主线程不能执行耗时太久的操作,Activity一般是不超过5s,BroadCaseReceiver一般不超过10s,因为这些耗时操作不仅仅阻塞UI线程操作,还可能导...
  • true100
  • true100
  • 2015年08月11日 11:42
  • 1841

Android异步加载学习笔记之三:用AsyncTask实现ListView中的图片数据加载

前面的笔记Android异步加载学习笔记之一:用AsyncTask加载服务器json数据和笔记 Android异步加载学习笔记之二:实现ListView中的图片数据从网络加载中有一点小错误,如果给大家...
  • true100
  • true100
  • 2015年08月11日 18:59
  • 848

在异步加载 AsyncTask 中用动态的数组作为参数

分析问题:在异步执行的时候,                           new DownloadTextTask().execute("http://192.168.1.56:30002/...
  • u011081756
  • u011081756
  • 2014年03月05日 16:31
  • 820

Android异步加载AsyncTask详解

最近项目发现个重大问题,结果打log跟踪查是AsyncTask导致的。如果对AsyncTask了解的不够深入透彻,那写代码就是埋雷。以后不定在哪个时间爆炸。首先我们要了解,谷歌为什么发明AsyncTa...
  • wdaming1986
  • wdaming1986
  • 2014年11月05日 20:03
  • 15009

ProgressBar AsyncTask实现界面数据异步加载

1ProgressBar+AsyncTask实现界面数据异步加载 2 实现说明   加载前:界面显示异步加载控件,隐藏数据显示控件,加载异常控件   加载成功:根据加载的数据,初...
  • zhangtian6691844
  • zhangtian6691844
  • 2016年04月05日 15:07
  • 884

android开发异步加载网络数据AsyncTask的使用

一、异步任务加载网络数据: 在android中提供了一个异步任务的类AsyncTask,简单来说,这个类中的任务是运行在后台线程中的,并可以将结果放到UI线程中进行处理,它定义了三种 泛型,分别是...
  • l1371985810
  • l1371985810
  • 2015年12月04日 15:26
  • 1416

Android通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比

在加载大量数据的时候,经常会用到异步加载,所谓异步加载,就是把耗时的工作放到子线程里执行,当数据加载完毕的时候再到主线程进行UI刷新。在数据量非常大的情况下,我们通常会使用两种技术来进行异步加载,一是...
  • jdsjlzx
  • jdsjlzx
  • 2015年02月09日 23:50
  • 6333
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:异步加载(AsyncTask)的用法
举报原因:
原因补充:

(最多只允许输入30个字)