`
y150988451
  • 浏览: 198495 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

AsyncTask

阅读更多

平时我们在开发Android程序时遇到较耗时任务的处理,如I/O访问的数据库操作、网络访问等情况时造成UI假死等问题,通过 AsyncTask可以很好的解决这个问题,就今天以在Android中执行Downloader.downloadFile(url),可能会堵塞整个界面。显然这会影响用户体验,我们如何解决这个问题呢? 

  方法一、 

  创建一个新的线程执行我们的任务,使用Thread类,在 run(){}中写入任务代码,比如: 

  new Thread(new Runnable() { 

  public void run() { 

  Downloader.downloadFile(url); 

  } 

  }).start(); 

  但使用Thread会产生一些意想不到的问题,需要程序员用更多的代码手动的维护它。 

  方法二: Android SDK为我们提供了一个后台任务的处理工具AsyncTask。AsyncTask就是一个封装过的后台任务类顾名思义就是异步任务,方便我们维护,Android开发网提示这样的好处可以解决一些线程安全问题,AsyncTask直接继承于Object类,位置为 android.os.AsyncTask。要使用AsyncTask工作我们要提供三个泛型参数,并重载四个方法(至少重载一个)。 

  三个泛型: 

  Param ,任务执行器需要的数据类型 

  Progress 后台计算中使用的进度单位数据类型 

  Result 后台计算返回结果的数据类型 

  有些参数是可以设置为不使用的,只要传递为Void型即可,比如AsyncTask 

  四个步骤: 

  onPreExecute(),执行预处理,它运行于UI线程,可以为后台任务做一些准备工作,比如绘制一个进度条控件。 

  doInBackground(Params...),后台进程执行的具体计算在这里实现,doInBackground(Params...)是AsyncTask的关键,此方法必须重载。在这个方法内可以使用 publishProgress(Progress...)改变当前的进度值。 

  onProgressUpdate(Progress...),运行于UI线程。如果在doInBackground(Params...)中使用了publishProgress(Progress...),就会触发这个方法。在这里可以对进度条控件根据进度值做出具体的响应。 

  onPostExecute(Result),运行于UI线程,可以对后台任务的结果做出处理,结果就是doInBackground(Params...)的返回值。此方法也要经常重载,如果Result为null表明后台任务没有完成(被取消或者出现异常)。 


Java代码  收藏代码
  1. public class main extends Activity {  
  2.     ImageView imageView01;  
  3.     TextView textView;  
  4.     @Override  
  5.     public void onCreate(Bundle savedInstanceState) {  
  6.         super.onCreate(savedInstanceState);  
  7.         setContentView(R.layout.main);  
  8.   
  9.         textView = (TextView) this.findViewById(R.id.TextView01);  
  10.         imageView01 = (ImageView) this.findViewById(R.id.ImageView01);  
  11.         GetImage getImage = new GetImage();  
  12.         getImage.execute("http://hi.csdn.net/attachment/201010/27/0_1288149117Yk8W.gif");  
  13.     }  
  14.   
  15.     private class GetImage extends AsyncTask {  
  16.   
  17.         public GetImage() {  
  18.             super();  
  19.             // TODO Auto-generated constructor stub  
  20.         }  
  21.   
  22.         @Override  
  23.         protected void onCancelled() {  
  24.             Log.i("czb""onCancelled is running...");  
  25.   
  26.             super.onCancelled();  
  27.         }  
  28.   
  29.         @Override  
  30.         protected void onPostExecute(Object result) {  
  31.             /* 
  32.              * 此方法在主线程执行,任务执行的结果作为此方法的参数返回 
  33.              */  
  34.             Log.i("czb""onPostExecute is running...");  
  35.             Log.i("czb""result == null ? " + (result == null));  
  36.             imageView01.setImageBitmap((Bitmap)result);  
  37.               
  38.             super.onPostExecute(result);  
  39.         }  
  40.   
  41.         @Override  
  42.         protected void onPreExecute() {  
  43.             /* 
  44.              * 执行预处理,它运行于UI线程,可以为后台任务做一些准备工作,比如绘制一个进度条控件 
  45.              */  
  46.             Log.i("czb""onPreExecute is running...");  
  47.               
  48.             super.onPreExecute();  
  49.         }  
  50.   
  51.         @Override  
  52.         protected void onProgressUpdate(Object... values) {  
  53.             /* 
  54.              * 此方法在主线程执行,用于显示任务执行的进度。 
  55.              */  
  56.             Log.i("czb""onProgressUpdate is running...");  
  57.             // 由publishProgress传递的值  
  58.             Log.i("czb""values " + values[0]);  
  59.             super.onProgressUpdate(values);  
  60.         }  
  61.   
  62.         @Override  
  63.         protected Object doInBackground(Object... params) {  
  64.             /* 
  65.              * 此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。 
  66.              * 在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。 
  67.              */  
  68.             Log.i("czb""doInBackground is running...");  
  69.               
  70.             try {  
  71.                 Bitmap bitmap;  
  72.                 HttpClient client = new DefaultHttpClient();  
  73.                 // params[0]代表连接的url  
  74.                 URI uri = URI.create((String) params[0]);  
  75.                 HttpGet get = new HttpGet(uri);  
  76.                 HttpResponse response = client.execute(get);  
  77.                 HttpEntity entity = response.getEntity();  
  78.                 long length = entity.getContentLength();  
  79.                 Log.i("czb""  " + length);  
  80.                 InputStream in = entity.getContent();  
  81.                 if (in != null) {  
  82.                     ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  83.                     /*byte[] buf = new byte[128]; 
  84.                     int ch = -1; 
  85.                     int count = 0; 
  86.                     while ((ch = in.read(buf)) != -1) { 
  87.                         baos.write(buf, 0, ch); 
  88.                         count += ch; 
  89.                         if (length > 0) { 
  90.                             // 如果知道响应的长度,调用publishProgress()更新进度 
  91.                             // onProgressUpdate读取进度 
  92.                             publishProgress((int) ((count / (float) length) * 100)); 
  93.                         } 
  94.                         // 为了在模拟器中清楚地看到进度,让线程休眠100ms 
  95.                         //Thread.sleep(100); 
  96.                     }*/  
  97.                     bitmap = BitmapFactory.decodeStream(in);  
  98.                     in.close();  
  99.                     baos.close();  
  100.                     return bitmap;  
  101.                 }  
  102.             } catch (Exception e) {  
  103.                 e.printStackTrace();  
  104.             }  
  105.             return null;  
  106.         }  
  107.   
  108.     }  
  109. }  

分享到:
评论

相关推荐

    Android AsyncTask异步处理下载网页

    Android提供了一种便捷的机制,名为`AsyncTask`,用于在后台线程执行这些任务,同时允许在主线程更新UI。`AsyncTask`是一个轻量级的框架,设计用来简化在Android应用程序中进行后台操作的过程。 `AsyncTask`包含三...

    AsyncTask类实例详解

    AsyncTask是Android中用于在后台线程执行耗时操作并更新UI的一种机制。它通过封装了线程管理和与主线程的交互,简化了在UI线程中处理异步任务的流程。下面我们将深入探讨AsyncTask的使用、原理以及如何更新UI。 ...

    AsyncTask结合HttpUrlConnection的例子

    在Android开发中,异步处理是非常重要的一环,特别是在与服务器进行数据交互时,为了保持UI线程的流畅性,避免出现"应用无响应"(ANR)的情况,开发者通常会使用`AsyncTask`。本例子是关于如何将`AsyncTask`与`...

    android中AsyncTask的用法

    在Android应用开发中,AsyncTask是一个用于在后台线程执行耗时操作并更新UI的工具类,它是Android 1.5版本引入的。AsyncTask的设计初衷是为了简化异步编程,避免直接操作线程和Handler带来的复杂性。下面我们将详细...

    AsyncTask加载网络图片,实现进度条的更新

    `AsyncTask`是Android提供的一种轻量级的并发工具,用于在后台线程执行任务,并在主线程更新UI。在本示例中,我们将深入探讨如何使用`AsyncTask`来加载网络图片并实时更新进度条。 首先,我们需要理解`AsyncTask`的...

    AsyncTask下载网络图片 进度条提示

    `AsyncTask`是Android提供的一种轻量级的异步处理机制,它可以帮助我们在主线程中轻松地执行后台任务,同时更新UI。本篇文章将详细探讨如何使用`AsyncTask`来实现网络图片的下载,并且展示进度条提示。 `AsyncTask`...

    Android AsyncTask 源码解析

    **Android AsyncTask 源码解析** AsyncTask 是 Android 平台上一个非常重要的工具类,用于在后台线程执行耗时操作,然后在 UI 线程更新结果,从而避免了因长时间运行任务而导致的 ANR(Application Not Responding...

    Handler与AsyncTask使用示例

    在Android开发中,`Handler`、`AsyncTask`和`Looper`是三个非常重要的概念,它们主要用于处理应用程序的异步操作和线程通信。本文将深入探讨这些知识点,并通过实例来展示它们如何协同工作。 首先,`Handler`是...

    Android AsyncTask用法和异步加载图片.rar

    Android提供了一种轻量级的机制来在后台执行这些任务,即`AsyncTask`。本资料包主要讲解了如何使用`AsyncTask`进行异步加载图片,这对于在UI线程中保持流畅用户体验至关重要。 `AsyncTask`是Android SDK中的一个类...

    android任务后台处理 asyncTask封装

    `AsyncTask`是Android提供的一种轻量级的异步处理机制,它能让我们在后台线程执行耗时操作,并在完成后更新主线程中的UI。下面我们将深入探讨`AsyncTask`的工作原理及其封装方法。 `AsyncTask`的核心在于三个泛型...

    01_AsyncTask_演示线程阻塞

    `AsyncTask`是Android提供的一种轻量级的异步任务处理框架,它允许开发者在后台线程执行耗时操作,然后在UI线程更新结果,避免了阻塞主线程导致的ANR(Application Not Responding)问题。这篇我们将深入探讨`...

    Android中异步类AsyncTask用法总结

    AsyncTask 是 Android 平台上一种轻量级的异步处理机制,主要用于在后台执行耗时操作,同时确保结果能够在主线程中安全地更新 UI。它简化了多线程编程,尤其是与用户界面交互的需求。 首先,AsyncTask 包含三个泛型...

    一个AsyncTask的Demo

    AsyncTask是Android平台中用于在后台执行耗时操作并更新UI的一种工具类。它主要设计用来简化异步处理,特别是那些需要与用户界面交互的任务。在这个"AsyncTask的Demo"中,我们将深入探讨AsyncTask的工作原理及其核心...

    Android 线程AsyncTask逐步在list中加入条目

    在这个"Android 线程AsyncTask逐步在list中加入条目"的例子中,我们首先会创建一个`AsyncTask`子类,如`LoadDataTask`,继承自`AsyncTask`。`doInBackground()`方法将用于生成数据(可能是从网络请求或本地数据库...

    AsyncTask的示例代码

    AsyncTask是Android开发中用于在后台执行任务并更新UI的重要工具。它允许开发者在主线程之外执行耗时操作,如网络请求、数据库操作等,同时能够方便地在工作完成时更新UI,避免了直接在主线程中进行这些操作导致的...

    面向对象思想实现AsyncTask类的复用

    在Android开发中,AsyncTask是一种轻量级的异步处理工具,用于在后台线程执行耗时操作,然后在UI线程更新结果。本篇文章将深入探讨如何利用面向对象的思想来实现AsyncTask类的复用,提高代码的可维护性和灵活性。 ...

    AndEngine_分析之三-----AsyncTask_BaseActivity备忘

    ### AndEngine分析之三——AsyncTask与BaseActivity深入解析 #### 一、AsyncTask概述 在AndEngine项目中,为了实现界面更新等操作时避免主线程阻塞的问题,使用了`AsyncTask`来处理后台任务。`AsyncTask`提供了一...

    AsyncTask加载网络图片

    在Android开发中,异步任务(AsyncTask)是一种常见的用于执行后台操作并更新UI线程的工具,尤其在处理耗时任务,如加载网络图片时非常有用。AsyncTask提供了简单的接口,使得开发者可以在后台线程中执行计算,然后...

    Android异步请求之AsyncTask

    `AsyncTask`是Android SDK提供的一种轻量级的异步处理机制,它使得开发者能够在后台线程执行任务,并在UI线程更新结果,避免了主线程被阻塞的风险。下面将详细解释`AsyncTask`的原理、使用方法以及注意事项。 ### ...

    AsyncTask的cancel的有效用法

    在Android开发中,AsyncTask是一种常用的轻量级异步任务处理框架,用于在后台线程执行耗时操作,然后在UI线程更新结果。当我们需要取消一个正在运行的AsyncTask时,就需要理解并正确使用`cancel`方法。本文将深入...

Global site tag (gtag.js) - Google Analytics