Android -- AsyncTask

简介:

在Android当中,提供了两种方式来解决线程直接的通信问题,一种是通过Handler的机制,还有一种就是今天要详细讲解的 AsyncTask 机制。

AsyncTask                                                                               

AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.

怎么来理解AsyncTask呢?通俗一点来说,AsyncTask就相当于Android给我们提供了一个多线程编程的一个框架,其介于Thread和Handler之间,我们如果要定义一个AsyncTask,就需要定义一个类来继承AsyncTask这个抽象类,并实现其唯一的一个 doInBackgroud 抽象方法。

3个泛型参数:

AsyncTask <Params, Progress, Result>
  • Params: 启动任务执行的输入参数,比如HTTP请求的URL。
  • Progress: 台任务执行的百分比。
  • Result: 后台执行任务最终返回的结果,比如String。

如果都不指定的话,则都将其写成Void,例如:

AsyncTask <Void, Void, Void>
  • onPreExecute(): 这个方法是在执行异步任务之前的时候执行,并且是在UI Thread当中执行的,通常我们在这个方法里做一些UI控件的初始化的操作,例如弹出要给ProgressDialog
  • doInBackground(Params... params): 在onPreExecute()方法执行完之后,会马上执行这个方法,这个方法就是来处理异步任务的方法,Android操作系统会在后台的线程池当中开启一个worker thread来执行我们的这个方法,所以这个方法是在worker thread当中执行的,这个方法执行完之后就可以将我们的执行结果发送给我们的最后一个 onPostExecute 方法,在这个方法里,我们可以从网络当中获取数据等一些耗时的操作
  • onProgressUpdate(Progess... values): 这个方法也是在UI Thread当中执行的,我们在异步任务执行的时候,有时候需要将执行的进度返回给我们的UI界面,例如下载一张网络图片,我们需要时刻显示其下载的进度,就可以使用这个方法来更新我们的进度。这个方法在调用之前,我们需要在 doInBackground 方法中调用一个 publishProgress(Progress) 的方法来将我们的进度时时刻刻传递给 onProgressUpdate 方法来更新
  • onPostExecute(Result... result): 当我们的异步任务执行完之后,就会将结果返回给这个方法,这个方法也是在UI Thread当中调用的,我们可以将返回的结果显示在UI控件上
  • onCancelled(): 用户调用取消时,要做的操作

代码                                                                                           

复制代码
public class yibu extends AsyncTask<Integer, Integer, String> {

    private int num = 0;
    private TextView text;
    public yibu(TextView textfrom) {
        // TODO 自动生成的构造函数存根
        this.text = textfrom;//传递进来一个TextView
    }
    
    @Override
    protected void onPostExecute(String result) {
        // TODO 自动生成的方法存根
        super.onPostExecute(result);
        text.setText("异步操作执行结束" + result);
    }

    @Override
    protected void onPreExecute() {
        // TODO 自动生成的方法存根
        super.onPreExecute();
        text.setText("开始执行异步操作");
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        // TODO 自动生成的方法存根
        super.onProgressUpdate(values);
        int value = values[0];
        System.out.println(value);
    }

    @Override
    protected String doInBackground(Integer... param) {
        // TODO 自动生成的方法存根    
        for(;num<10;num++)
        {
            publishProgress(num);//调用onProgressUpdate()
        }
        return num + param[0].intValue() + "";//调用onPostExecute,值直接传进去
    }
}
复制代码

源代码                                                                                        

代码:http://pan.baidu.com/s/1dD1Qx01

Second.zip

com.yuyidong.second.yibu.java

还有一个例子,

yibu.zip

 




本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/3707960.html,如需转载请自行联系原作者

相关文章
|
7月前
|
Java 数据库 Android开发
Android异步之旅:探索AsyncTask
Android异步之旅:探索AsyncTask
57 0
|
3月前
|
Android开发 开发者 Kotlin
告别AsyncTask:一招教你用Kotlin协程重构Android应用,流畅度飙升的秘密武器
【9月更文挑战第13天】随着Android应用复杂度的增加,有效管理异步任务成为关键。Kotlin协程提供了一种优雅的并发操作处理方式,使异步编程更简单直观。本文通过具体示例介绍如何使用Kotlin协程优化Android应用性能,包括网络数据加载和UI更新。首先需在`build.gradle`中添加coroutines依赖。接着,通过定义挂起函数执行网络请求,并在`ViewModel`中使用`viewModelScope`启动协程,结合`Dispatchers.Main`更新UI,避免内存泄漏。使用协程不仅简化代码,还提升了程序健壮性。
85 1
|
6月前
|
Android开发
40. 【Android教程】AsyncTask:异步任务
40. 【Android教程】AsyncTask:异步任务
136 2
|
7月前
|
数据库 Android开发
android AsyncTask
android AsyncTask
45 1
|
7月前
|
Java Android开发
Android 中的AsyncTask的使用心得
Android 中的AsyncTask的使用心得
33 1
|
7月前
|
Android开发 开发者
Android AsyncTask 的使用
Android AsyncTask 的使用
45 1
|
7月前
|
安全 API 数据库
【转】Android线程模型(AsyncTask的使用)
【转】Android线程模型(AsyncTask的使用)
43 1
|
7月前
|
Android开发
Android中的多线程及AsyncTask的引入,最终入职阿里
Android中的多线程及AsyncTask的引入,最终入职阿里
|
7月前
|
Java Android开发
android AsyncTask入门
android AsyncTask入门
31 0
|
7月前
|
Android开发 开发者
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
Android&#39;s AsyncTask simplifies asynchronous tasks for brief background work, bridging UI and worker threads. It involves execute() for starting tasks, doInBackground() for background execution, publishProgress() for progress updates, and onPostExecute() for returning results to the main thread.
40 0