`
咖啡动力
  • 浏览: 434869 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

主要讲解下AsyncTask的使用

 
阅读更多
本文章主要讲解下AsyncTask的使用。

       首先,我们得明确下一个概念,什么是UI线程。顾名思义,ui线程就是管理着用户界面的那个线程!

       android的ui线程操作并不是安全的,并且和用户直接进行界面交互的操作都必须在ui线程中进行才可以。这种模式叫做单线程模式。我们在单线程模式下编程一定要注意:不要阻塞ui线程、确保只在ui线程中访问ui组件。

       当我们要执行一个复杂耗时的算法并且最终要将计算结果反映到ui上时,我们会发现,我们根本没办法同时保证上面的两点要求;我们肯定会想到开启一个新的线程,让这个复杂耗时的任务到后台去执行,但是执行完毕了呢?我们发现,我们无法再与ui进行交互了。

      为了解决这种情况,android为我们提供了很多办法。

1)、handler和message机制:通过显示的抛出、捕获信息与ui进行交互;

2)、Activity.runOnUiThread(Runnable):如果当前线程为ui线程,则立即执行;否则,将参数中的线程操作放入到ui线程的事件队列中,等待执行。

3)、View.post(Runnable):将操作放入到message队列中,如果放入成功,该操作将会在ui线程中执行,并返回true,否则返回false

4)、View.postDelayed(Runnable,long)跟第三条基本一样,只不过添加了一个延迟时间。


5)、android1.5以后为我们提供了一个工具类来搞定这个问题AsyncTask.

AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Params,Progress和Result。
  

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


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



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


  。


用程序调用,开发者需要做的就是实现这些方法。


  

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



view plaincopy to clipboardprint?
01.package cn.com.chenzheng_java;  
02. 
03.import android.os.AsyncTask;  
04./** 
05. *  
06. * @author chenzheng_java 
07. * @description 异步任务AcyncTask示例 
08. *   
09. */ 
10.public class MyAsyncTask extends AsyncTask<String, Integer, Object> {  
11. 
12.    /** 
13.     * 该方法由ui线程进行调用,用户可以在这里尽情的访问ui组件。 
14.     * 很多时候,我们会在这里显示一个进度条啥的,以示后台正在 
15.     * 执行某项功能。 
16.     */ 
17.    @Override  
18.    protected void onPreExecute() {  
19.        super.onPreExecute();  
20.    }  
21.      
22.    /** 
23.     * 该方法由后台进程进行调用,进行主要的耗时的那些计算。 
24.     * 该方法在onPreExecute方法之后进行调用。当然在执行过程中 
25.     * 我们可以每隔多少秒就调用一次publishProgress方法,更新 
26.     * 进度信息 
27.     */ 
28.    @Override  
29.    protected Object doInBackground(String... params) {  
30.        return null;  
31.    }  
32. 
33.      
34.    /** 
35.     * doInBackground中调用了publishProgress之后,ui线程就会 
36.     * 调用该方法。你可以在这里动态的改变进度条的进度,让用户知道 
37.     * 当前的进度。 
38.     */ 
39.    @Override  
40.    protected void onProgressUpdate(Integer... values) {  
41.        super.onProgressUpdate(values);  
42.    }  
43. 
44.    /** 
45.     * 当doInBackground执行完毕之后,由ui线程调用。可以在这里 
46.     * 返回我们计算的最终结果给用户。 
47.     */ 
48.    @Override  
49.    protected void onPostExecute(Object result) {  
50.        super.onPostExecute(result);  
51.    }  
52. 
53. 
54. 
55.      
56.} 
package cn.com.chenzheng_java;

import android.os.AsyncTask;
/**
*
* @author chenzheng_java
* @description 异步任务AcyncTask示例
*
*/
public class MyAsyncTask extends AsyncTask<String, Integer, Object> {

/**
* 该方法由ui线程进行调用,用户可以在这里尽情的访问ui组件。
* 很多时候,我们会在这里显示一个进度条啥的,以示后台正在
* 执行某项功能。
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
}

/**
* 该方法由后台进程进行调用,进行主要的耗时的那些计算。
* 该方法在onPreExecute方法之后进行调用。当然在执行过程中
* 我们可以每隔多少秒就调用一次publishProgress方法,更新
* 进度信息
*/
@Override
protected Object doInBackground(String... params) {
return null;
}


/**
* doInBackground中调用了publishProgress之后,ui线程就会
* 调用该方法。你可以在这里动态的改变进度条的进度,让用户知道
* 当前的进度。
*/
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
}

/**
* 当doInBackground执行完毕之后,由ui线程调用。可以在这里
* 返回我们计算的最终结果给用户。
*/
@Override
protected void onPostExecute(Object result) {
super.onPostExecute(result);
}




}




------------------------------------------------------------------------------------------

AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,这些方法不应该由应

分享到:
评论

相关推荐

    AsyncTask基本使用

    这个demo主要讲解了AsyncTask的基本使用,希望可以帮助需要的同学.

    AsyncTask下载网络图片

    这个demo主要讲解了使用AsyncTask 异步下载网络图片,希望可以帮助需要的同学.

    AsyncTask 源码解析

    AsyncTask 源码解析

    Android异步请求之AsyncTask

    本压缩包主要包括一个AsyncTask异步请求的demo,以及一个讲解AsyncTask流程及用法的文档说明,希望能帮到你

    Android异步操作实例源码----AsyncTask类

    以从网上下载图片为例,讲解Android自带的异步操作类----AsyncTask类的用法 public class DownloadPicture extends AsyncTask, Integer, Bitmap&gt; 其中包含三个异步操作类可供测试

    AsyncTask的示例代码

    对应讲解地址http://blog.csdn.net/zzjjqqzzhhqq/article/details/38645131

    异步AsyncTask状态监控

    android中关于AsyncTask的详细讲解实例,包含了异步任务结束状态的监控,免费下载!

    Android AsyncTask的优缺点详解

    Asynctask作为Android的基础之一,怎么使用就不多讲解了,网上到处都是教程,建议查看Android官方API文档:https://developer.android.google.cn/reference/android/os/AsyncTask.html 这里只实现一个小Demo程序,供...

    深入浅出AsyncTask的工作原理

    在讲解AsyncTask的原理前,我们需要先来复习或者学习下其用到的数据结构。这些是我们必须要了解的数据结构。 Executor: 查看如下注释和中文解释,可以了解其实现即可以是串行执行也可以顺序执行,完全取决于使用了...

    Android中使用AsyncTask做下载进度条实例代码

    AsyncTask是个不错的东西,可以使用它来做下载进度条。代码讲解如下: package com.example.downloadfile; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.net....

    Android 使用AsyncTask实现多线程断点续传

    前面一篇博客《AsyncTask实现断点续传》讲解了如何实现单线程下的断点续传,也就是一个文件只有一个线程进行下载。  对于大文件而言,使用多线程下载就会比单线程下载要快一些。多线程下载相比单线程下载要稍微复杂...

    详解Android中AsyncTask机制

    在Android当中,提供了两种方式来解决线程直接的通信问题,一种是通过Handler的机制,还有一种就是今天要详细讲解的 AsyncTask 机制。 AsyncTask  AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask...

    AsyncTaskTest

    AsyncTaskTest 异步加载类:http://blog.csdn.net/qqmcy/article/details/39890837 使用文章 将TextureCache类异步加载功能讲解

    Android多线程AsyncTask详解

    本篇随笔将讲解一下Android的多线程的知识,以及如何通过AsyncTask机制来实现线程之间的通信。 一、android当中的多线程 在Android当中,当一个应用程序的组件启动的时候,并且没有其他的应用程序组件在运行时,...

    android 异步任务 Binder 线程间交互 Handler 迭代器模式

    android 线程交互 进程讲解 Handler Message AsyncTask 线程模式

    Android Aysnctask更新UI

    本篇讲解AsyncTask的使用,并且举了完整的例,Android提供了以下几个办法,Handler更新UI;广播中更新UI;Activity runOnUiThread(Runnable run);View:post();View:postDelayed();AsyncTask。

    Android知识点及重要代码合集 word文档

    17.1 Loader的使用步骤及SearchView的使用 237 17.2 AsyncTaskLoader的使用步骤以及它与CusorLoader的区别 245 18.1 使用Handler完成子线程发送消息和Runnable对象到主线程 250 18.2 使用Handler完成主线程发送消息...

    Android三级缓存原理讲解

    三级缓存 内存缓存 本地缓存(SD卡缓存) 网络缓存 ...网络缓存顾名思义就是从网络获取图片资源,然后来进行显示,那么我们可以通过AsyncTask来异步处理网络请求,然后主线程设置图片。 本地缓存 当从网

Global site tag (gtag.js) - Google Analytics