Android AsyncTask异步处理

在开发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

它使创建需要与用户界面交互的长时间运行的任务变得更简单,不需要借助线程和Handler 即可实现。

AsyncTask是抽象类,它定义了三种泛型类型: Params,Progress,Result

Params 启动任务执行的输入参数 ,比如HTTP请求的URL。

Progress 后台任务执行的百分比。

Result 后台执行任务最终返回的结果,比如String。

AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,这些方法不应该由应用程序调用(即用户不可直接调用, 而应由系统调用),开发者需要做的就是实现这些方法。

1) 子类化AsyncTask

2) 实现AsyncTask中定义的下面一个或几个 方法

(a)onPreExecute(), 该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,如在界 面上显示一个进度条。

(b)doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程 中。这里将主要负责执行那些很耗时的后台计算工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方 法,子类必须实现。

(c)onProgressUpdate(Progress...),在publishProgress方法被调用后,UI thread将调用这个方法从 而在界面上展示任务的进展情况,例如通过一个进度条进行展示。

(d)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只能被执行一次,否则多次调用时将会出现异常

时间: 2024-07-30 07:46:43

Android AsyncTask异步处理的相关文章

android AsyncTask异步下载并更新进度条

AsyncTask异步下载并更新进度条    //如果不是很明白请看上篇文章的异步下载 AsyncTask<String, Integer, String> 第一个参数:String 传入的是需要下载的地址 第二个参数:Integer 是进度条的进度 第三个参数:String 下载后的结果,如果您下载的是一张图片,可以将它改成BitMap 示例代码如下: package com.example.testcctv; import java.io.ByteArrayOutputStream; im

Android AsyncTask异步线程

    (图)           在开发Android移动客户端的时候往往要使用多线程来进行操作,我们通常会将耗时的操作放在单独的线程执行,避免其占用主线程而给用户带来不好的用户体验.但是在子线程中无法去操作主线程(UI 线程),在子线程中操作UI线程会出现错误.因此android提供了一个类Handler来在子线程中来更新UI线程,用发消息的机制更新UI界面,呈现给用户.这样就解决了子线程更新UI的问题.但是费时的任务操作总会启动一些匿名的子线程,太多的子线程给系统带来巨大的负担,随之带来一

Android中异步类AsyncTask用法总结_Android

本文总结分析了Android中异步类AsyncTask用法.分享给大家供大家参考,具体如下: 最近整理笔记的时候,看到有关AsyncTask不是很理解,重新疏导了一下,有在网上找了一些资料,个人不敢独享,一并发在这里与大家共勉 这里有两种解释的方法,各有侧重点: 第一种解释: Async Task 简介: AsyncTask的特点是任务在主线程之外运行,而回调方法是在主线程中执行,这就有效地避免了使用Handler带来的麻烦 AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Pa

Android中AsyncTask异步任务使用详细实例(一)_Android

AsyncTask是Android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程. 使用AsyncTask最少要重写以下两个方法: 1.doInBackground(Params-) 后台执行,比较耗时的操作都可以放在这里.注意这里不能直接操作UI.此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间.在执行过程中可以调用publicProgress(Progres

详解Android App中的AsyncTask异步任务执行方式_Android

基本概念 AsyncTask:异步任务,从字面上来说,就是在我们的UI主线程运行的时候,异步的完成一些操作.AsyncTask允许我们的执行一个异步的任务在后台.我们可以将耗时的操作放在异步任务当中来执行,并随时将任务执行的结果返回给我们的UI线程来更新我们的UI控件.通过AsyncTask我们可以轻松的解决多线程之间的通信问题. 怎么来理解AsyncTask呢?通俗一点来说,AsyncTask就相当于Android给我们提供了一个多线程编程的一个框架,其介于Thread和Handler之间,我

Android利用AsyncTask异步类实现网页内容放大缩小_Android

本文实例为大家分享了AsyncTask异步类实现网页内容放大缩小的详细代码,供大家参考,具体内容如下 WebActivity.java: package com.supermario.filemanager; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import org.apache.http.pro

Android的异步任务AsyncTask详解_Android

AsyncTask,顾名思义,异步任务.说到异步,最简单的理解就是不同步.再复杂一点理解,就得举例子了. 假设我要去火车站买票,刚到火车站我突然发现我忘了带身份证.怎么办?怎么办! 想办法,想办法!我想我应该找个在学校的同学帮我送过来,因为我不能自己回去拿啊,还要排队呢,走不开.嗯,要找人送过来.但是问题来了,我找人送身份证了,我去排队了,如果排到第一位了身份证还没到怎么办?叮,脑袋上面突然亮了一个小灯泡,机智的我在排队前想到了两种方案: 第一种方案,让售票员等着我,我后面队伍里买票的人也等着我

Android AsyncTask 后监听异步加载完毕的动作详解_Android

Android 使用AsyncTask 后监听异步加载完毕的动作   AsyncTask 的使用方法网上有很多例子,使用起来也非常的方便.这里就不详细说具体的使用方法了,同学可以Google 一下,很多. 场景模拟       当我们在加载一个列表的时候,比如GridView ,这时候我们考虑到不阻塞UI的做法,一般会使用线程Thread .Timer 或者使用AsyncTask ,而这些操作都是在在后台另外开一个线程给我们找数据,具体得到的数据需要使用Handler 去更新UI,AsyncTa

Android 中使用 AsyncTask 异步读取网络图片_Android

 1.新建Android工程AsyncLoadPicture 新建布局文件activity_main.xml主界面为一个GridView,还有其子项布局文件gridview_item.xml 2.功能主界面MainActivity.java,主代码如下 package com.example.asyncloadpicture; import java.util.ArrayList; import android.app.Activity; import android.content.Conte