`
kerlubasola
  • 浏览: 709988 次
文章分类
社区版块
存档分类
最新评论

Android中AsyncTask的简单用法

 
阅读更多

http://blog.csdn.net/cjjky/article/details/6684959

在开发Android移动客户端的时候往往要使用多线程来进行操作,我们通常会将耗时的操作放在单独的线程执行,避免其占用主线程而给用户带来不好的用户体验。但是在子线程中无法去操作主线程(UI 线程),在子线程中操作UI线程会出现错误。因此android提供了一个类Handler来在子线程中来更新UI线程,用发消息的机制更新UI界面,呈现给用户。这样就解决了子线程更新UI的问题。但是费时的任务操作总会启动一些匿名的子线程,太多的子线程给系统带来巨大的负担,随之带来一些性能问题。因此android提供了一个工具类AsyncTask,顾名思义异步执行任务。这个AsyncTask生来就是处理一些后台的比较耗时的任务,给用户带来良好用户体验的,从编程的语法上显得优雅了许多,不再需要子线程和Handler就可以完成异步操作并且刷新用户界面。

先大概认识下Android.os.AsyncTask类:

* android的类AsyncTask对线程间通讯进行了包装,提供了简易的编程方式来使后台线程和UI线程进行通讯:后台线程执行异步任务,并把操作结果通知UI线程。

* AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Params,Progress和Result。
  * Params 启动任务执行的输入参数,比如HTTP请求的URL。
  * Progress 后台任务执行的百分比。
  * Result 后台执行任务最终返回的结果,比如String,Integer等。

* AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,开发者需要实现这些方法。

  * 1) 继承AsyncTask
  * 2) 实现AsyncTask中定义的下面一个或几个方法
* onPreExecute(), 该方法将在执行实际的后台操作前被UI 线程调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条,或者一些控件的实例化,这个方法可以不用实现。
* doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台处理工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。
* onProgressUpdate(Progress...),在publishProgress方法被调用后,UI 线程将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
* onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI 线程调用,后台的计算结果将通过该方法传递到UI 线程,并且在界面上展示给用户.

* onCancelled(),在用户取消线程操作的时候调用。在主线程中调用onCancelled()的时候调用。

为了正确的使用AsyncTask类,以下是几条必须遵守的准则:

  1) Task的实例必须在UI 线程中创建

  2) execute方法必须在UI 线程中调用

  3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法,需要在UI线程中实例化这个task来调用。

  4) 该task只能被执行一次,否则多次调用时将会出现异常

doInBackground方法和onPostExecute的参数必须对应,这两个参数在AsyncTask声明的泛型参数列表中指定,第一个为doInBackground接受的参数,第二个为显示进度的参数,第第三个为doInBackground返回和onPostExecute传入的参数。

下面通过一个Demo来说明如何使用Android.os.AsyncTask类,通过进度条来显示进行的进度,然后用TextView来显示进度值。程序结构图如下:

[1] \layout\main.xml 布局文件源码如下:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <TextView
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:text="Hello,WelcometoAndy'sBlog!"/>
  11. <Button
  12. android:id="@+id/download"
  13. android:layout_width="fill_parent"
  14. android:layout_height="wrap_content"
  15. android:text="Download"/>
  16. <TextView
  17. android:id="@+id/tv"
  18. android:layout_width="fill_parent"
  19. android:layout_height="wrap_content"
  20. android:text="当前进度显示"/>
  21. <ProgressBar
  22. android:id="@+id/pb"
  23. android:layout_width="fill_parent"
  24. android:layout_height="wrap_content"
  25. style="?android:attr/progressBarStyleHorizontal"/>
  26. </LinearLayout>


[2] /src中的MainActivity.java源码如下:

  1. packagecom.andyidea.demo;
  2. importandroid.app.Activity;
  3. importandroid.os.AsyncTask;
  4. importandroid.os.Bundle;
  5. importandroid.view.View;
  6. importandroid.widget.Button;
  7. importandroid.widget.ProgressBar;
  8. importandroid.widget.TextView;
  9. publicclassMainActivityextendsActivity{
  10. Buttondownload;
  11. ProgressBarpb;
  12. TextViewtv;
  13. /**Calledwhentheactivityisfirstcreated.*/
  14. @Override
  15. publicvoidonCreate(BundlesavedInstanceState){
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.main);
  18. pb=(ProgressBar)findViewById(R.id.pb);
  19. tv=(TextView)findViewById(R.id.tv);
  20. download=(Button)findViewById(R.id.download);
  21. download.setOnClickListener(newView.OnClickListener(){
  22. @Override
  23. publicvoidonClick(Viewv){
  24. DownloadTaskdTask=newDownloadTask();
  25. dTask.execute(100);
  26. }
  27. });
  28. }
  29. classDownloadTaskextendsAsyncTask<Integer,Integer,String>{
  30. //后面尖括号内分别是参数(例子里是线程休息时间),进度(publishProgress用到),返回值类型
  31. @Override
  32. protectedvoidonPreExecute(){
  33. //第一个执行方法
  34. super.onPreExecute();
  35. }
  36. @Override
  37. protectedStringdoInBackground(Integer...params){
  38. //第二个执行方法,onPreExecute()执行完后执行
  39. for(inti=0;i<=100;i++){
  40. pb.setProgress(i);
  41. publishProgress(i);
  42. try{
  43. Thread.sleep(params[0]);
  44. }catch(InterruptedExceptione){
  45. e.printStackTrace();
  46. }
  47. }
  48. return"执行完毕";
  49. }
  50. @Override
  51. protectedvoidonProgressUpdate(Integer...progress){
  52. //这个函数在doInBackground调用publishProgress时触发,虽然调用时只有一个参数
  53. //但是这里取到的是一个数组,所以要用progesss[0]来取值
  54. //第n个参数就用progress[n]来取值
  55. tv.setText(progress[0]+"%");
  56. super.onProgressUpdate(progress);
  57. }
  58. @Override
  59. protectedvoidonPostExecute(Stringresult){
  60. //doInBackground返回时触发,换句话说,就是doInBackground执行完后触发
  61. //这里的result就是上面doInBackground执行后的返回值,所以这里是"执行完毕"
  62. setTitle(result);
  63. super.onPostExecute(result);
  64. }
  65. }
  66. }


[3] 下面看下程序的运行结果截图:


分享到:
评论

相关推荐

    android中AsyncTask的用法

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

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

    2. 在`doInBackground()`方法中,使用HttpURLConnection或OkHttp等库从网络获取图片的字节流,然后转换为Bitmap。 3. 使用`onPostExecute(Bitmap bitmap)`将加载好的Bitmap设置到ImageView或其他视图组件中。 4. 当...

    Android中异步类AsyncTask用法总结

    总之,AsyncTask 是 Android 开发中处理短时、简单异步任务的得力助手,它简化了多线程与 UI 更新的同步问题,但不适用于所有异步场景。正确理解和使用 AsyncTask,可以帮助开发者更高效地构建用户界面,提升用户...

    Android中AsyncTask的用法实例[收集].pdf

    `doInBackground`方法中也使用了`ByteArrayOutputStream`和`InputStream`来读取输入流中的内容,并将其转换成字符串。这部分代码演示了如何从网络响应中读取数据,这可能包括处理不同字符编码、网络错误处理等。 `...

    Android中AsyncTask与handler用法实例分析

    Android开发中,异步处理是必不可少的,尤其是当涉及到与用户界面交互时。AsyncTask和Handler是Android系统...在Android开发中,合理使用这两种机制可以有效地提升应用的用户体验,避免UI线程被阻塞导致的无响应问题。

    Android中AsyncTask的入门使用学习指南

    Android的AsyncTask是一个轻量级的异步任务框架,用于在后台线程执行耗时操作,并在主线程中更新UI。它是Android SDK提供的一种简化多线程编程的方式,尤其适用于进行短时间的、与用户界面交互紧密的任务。 ...

    android中AsyncTask和jni技术简单应用--附案例附代码

    在Android开发中,AsyncTask和JNI(Java Native Interface)是两种重要的技术,分别用于处理后台任务和调用原生C/C++代码。本篇文章将详细阐述这两种技术的应用及其结合使用的情况,并提供相关案例和代码。 首先,...

    Android最全最简单的异步任务AsyncTask使用解析

    在这个示例中,我们使用AsyncTask来执行一个耗时的操作,在doInBackground()方法中,我们使用了while循环来模拟一个耗时的操作,并使用publishProgress()方法来更新进度。在onProgressUpdate()方法中,我们更新...

    Android中AsyncTask实现多线程计数

    本篇将详细讲解如何在Android中使用AsyncTask实现多线程计数,并展示如何将计数结果显示到UI。 首先,我们需要理解Android的线程模型。Android应用的主要工作线程是主线程,也称为UI线程。这个线程负责绘制和交互UI...

    Android AsyncTask 源码解析

    通过以上对 AsyncTask 的源码解析和使用方法的介绍,你应该对如何在 Android 应用中高效地使用异步任务有了更深入的理解。在实际开发中,正确理解和使用 AsyncTask 可以帮助我们编写出更加流畅、响应快速的应用程序...

    Android 使用AsyncTask异步更新UI界面

    本文将详细探讨如何在Android中使用`AsyncTask`来异步更新UI界面。 ### 一、AsyncTask概述 `AsyncTask`是Android SDK提供的一种轻量级的异步任务处理类,它简化了在后台线程中执行任务并在UI线程中更新结果的过程...

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

    总之,通过这个例子,新手可以了解到如何使用`AsyncTask`处理多线程,以及如何在Android应用中动态更新ListView。这是一项基础但至关重要的技能,对于理解和优化Android应用性能至关重要。在实际项目中,还可以根据...

    Android Handler AsyncTask 异步加载

    - AsyncTask更适合一次性、短时间的后台任务,它的使用更简单,但对多任务处理支持不足,且从Android P开始被官方建议避免使用。 - 对于更复杂的异步加载需求,如网络请求、大数据量的IO操作,推荐使用更专业的库,...

    Android开发之AsyncTask机制及使用细节例子源码

    在Android应用开发中,异步任务(AsyncTask)是一个常用工具,用于在后台线程执行耗时操作,然后在UI线程更新结果,避免阻塞用户界面。AsyncTask的使用和内部机制对于任何Android开发者来说都至关重要。让我们深入...

    asyncTask简单使用

    因此,你应该在Activity的onPause()或onDestroy()方法中取消AsyncTask。 10. **内存泄漏**:避免在AsyncTask中持有对Activity的引用,否则可能导致Activity无法正常销毁,从而造成内存泄漏。 总的来说,AsyncTask...

    Android的AsyncTask异步任务

    在此方法中,可以进行网络请求、数据库操作等。 3. **publishProgress(Progress... values)**:在doInBackground中调用此方法,可以向主线程发送进度更新,这对于显示进度条或通知用户任务进度非常有用。 4. **...

    Android_AsyncTask使用

    ### Android AsyncTask 使用详解 #### 一、AsyncTask 概览 ...以上是 AsyncTask 的基本使用方法和注意事项,掌握了这些知识点后,开发者可以在 Android 应用中更高效地进行多线程编程,提高用户体验。

    Android AsyncTask的简单Demo

    本篇文章将深入探讨`AsyncTask`的工作原理和如何在实际项目中使用。 首先,`AsyncTask`类定义了三个泛型参数:`Params`、`Progress`和`Result`。`Params`表示执行任务所需的输入参数,`Progress`表示后台任务执行...

    Android_AsyncTask_详解

    在 Android 开发中,为了保持应用程序的响应性,避免 UI 假死现象,`AsyncTask` 提供了一种简单的异步编程模型,允许开发者在后台线程中执行耗时任务,同时可以在 UI 线程中更新用户界面。 `AsyncTask` 的核心思想...

    Android用AsyncTask异步加载图片(新)

    本篇文章将深入探讨如何在Android中使用`AsyncTask`来异步加载网络图片。 首先,我们了解`AsyncTask`的基本结构。`AsyncTask`有三个泛型参数:`Params`, `Progress`, 和 `Result`。在本例中,`Params`通常是网络...

Global site tag (gtag.js) - Google Analytics