AsyncTask中各个函数详细的调用过程,初步实现异步任务

异步任务是我们经常要使用的东西,android中提供了一套解决方案,从异步任务的开始到结束,相当完善。本实例没有任何应用价值,只是说明了AsyncTask中各个函数的调用顺序。

具体的结果看下面的Log输出即可:

异步任务类:

AsyncTaskTest.java

package com.kale.asynctask;

import java.net.URL;

import android.R.integer;
import android.os.AsyncTask;

/**
 * @author:Jack Tony
 * @tips  :
 * 必须在UI线程中创建AsyncTask实例
 * 必须在UI线程中执行AsyncTask的execute方法
 * 每个AsyncTask只能执行一次,不能多次调用。要用的话再生成一个对象再执行即可
 * @date  :2014-8-1
 */
/**
 * @param
 * execute传来的参数是第三个参数
 * 第一个参数的类型提供给publishProgress做参数(可变长的数组)
 * 第二个参数定义的是onProgressUpdate的参数类型(可变长的数组)
 * 第三个参数作为doInBackground返回值的类型,返回给onPostExecute做形参
 */
public class AsyncTaskTest extends AsyncTask<URL, Integer, String>{

    /* (非 Javadoc)
     * @see android.os.AsyncTask#onPreExecute()
     * 开始异步任务前会调用此方法,这个方法执行在UI线程中
     */
    @Override
    protected void onPreExecute() {
        System.out.println("onPreExecute 开始执行");
        System.out.println("onPreExecute 执行初始化操作,执行UI操作");
        System.out.println("onPreExecute 所在的线程:"+Thread.currentThread().getName());
        System.out.println("onPreExecute 执行完毕,开始执行doInBackground");
    }
    /*
     * @see android.os.AsyncTask#doInBackground(Params[]),里面就是个可变长度的数组
     * 里面写后台线程要完成任务,里面可以调用publishProgress(values);更新进度
     * 可以有变长的参数,对个数无要求
     */
    @Override
    protected String doInBackground(URL... params) {
        System.out.println("doInBackground 开始执行");
        System.out.println("doInBackground 执行耗时的异步任务");
        System.out.println("doInBackground 所在的线程:"+Thread.currentThread().getName());
        System.out.println("doInBackground 执行耗时的异步任务");
        System.out.println("doInBackground 中调用publishProgress更新下视图");
        for (int i = 0; i < 3; i++) {
            publishProgress(i);//这里传的值是给onProgressUpdate做参数的,这里传的也是一个可变长的数组
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }
        }
        System.out.println("doInBackground 执行完毕,准备执行onPostExecute");
        return "doInBackground执行完后的结果";
    }

    /* (非 Javadoc)
     * @see android.os.AsyncTask#onProgressUpdate(Progress[])
     * 在doInBackground中调用publishProgress时会执行这个方法,主要用来更新进度
     * 执行在UI线程中
     */
    @Override
    protected void onProgressUpdate(Integer... values) {
        System.out.println("onProgressUpdate 开始执行,更新UI视图,一般是进度");
        System.out.println("onProgressUpdate 执行第【"+(values[0].intValue()+1)+"】次更新操作");
        System.out.println("onProgressUpdate 所在的线程:"+Thread.currentThread().getName());
        System.out.println("onProgressUpdate 执行完毕,更新操作结束");
    }

    /* (非 Javadoc)
     * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
     * 在doInBackground执行完后,系统将doInBackground方法返回的参数作为形参传递到这个方法中
     * 它执行在UI线程中
     */
    @Override
    protected void onPostExecute(String result) {
        System.out.println("onPostExecute 开始执行,更新UI视图");
        System.out.println("onPostExecute 接收到的处理结果是:【"+result+"】");
        System.out.println("onPostExecute 执行收尾操作");
        System.out.println("onPostExecute 所在的线程:"+Thread.currentThread().getName());
        System.out.println("onPostExecute 执行完毕,异步任务完全结束");
    }
}

MainActivity.java

package com.kale.asynctask;

import java.net.MalformedURLException;
import java.net.URL;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        AsyncTaskTest async = new AsyncTaskTest();
        URL url = null;
        try {
            url = new URL("http://www.baidu.com");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        async.execute(url,url);//这里传进去的数据是给doInBackground做参数用的,可以传任意个参数
    }
}

AsyncTask中各个函数详细的调用过程,初步实现异步任务

时间: 2024-10-18 09:27:02

AsyncTask中各个函数详细的调用过程,初步实现异步任务的相关文章

php中session_id()函数详细介绍,会话id生成过程及session id长度

php中session_id()函数原型及说明session_id()函数说明:stringsession_id([string$id])session_id() 可以用来获取/设置 当前会话 ID.为了能够将会话 ID 很方便的附加到 URL 之后, 你可以使用常量 SID 获取以字符串格... php中session_id()函数原型及说明 session_id()函数说明: ? 1 string session_id ([ string $id ] ) session_id() 可以用来获

C++和C中的函数如何相互调用

今天笔试遇到的一题,当时就写了在函数前声明为C,按C编译. 首先是在C中调用C++函数,包括普通函数,重载函数以及成员函数. 对于普通函数,在C++中声明为extern "C",在C中调用. 但对于成员函数和重载函数,则需要一个简单的包装. 具体可参考:http://www.cppblog.com/franksunny/archive/2007/11/29/37510.html 在C++中调用C函数时,用extern "C"函数名即可. 参考:http://blog

SAP 中 Webservice的发布和调用过程。

SICF的服务配置 交由Basis大佬处理,我们只说Abap端.建立RFC函数 用来做Webservice Provider . 用这个地址生成.xml文件后面Somanamger处理消费者接口 的逻辑端口时,以文件的形式导入. 第二部 创建消费者接受端口. 保存激活 成功. 第三步事务码SOAMANMGER   .调用和发布 太多了 不想截图了这就是结果了. 原文地址:https://www.cnblogs.com/hdchen/p/9190338.html

GDB踪函数的完整调用过程 及原理

http://www.lenky.info/archives/2013/02/2202 Breakpoint 1, 0x0000003c4e417410 in open64 () from /lib64/ld-linux-x86-64.so.2 (gdb) bt #0 0x0000003c4e417410 in open64 () from /lib64/ld-linux-x86-64.so.2 #1 0x0000003c4e40f789 in _dl_sysdep_read_whole_fil

函数递归调用过程中的调用堆栈的情况

为了加深对函数递归调用过程中的理解,本Demo程序特意在VS2008 C#控制台程序实现了阶乘的计算功能,用于观察函数递归调用过程中的调用堆栈的情况. 源码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace RecursiveTset { class Program { //阶乘的定义:n!=n*(n-1)!,特别的,1!=1:0!=1 //阶乘的实

[Android Pro] 深入理解函数的调用过程——栈帧

cp :http://blog.csdn.net/x_perseverance/article/details/78897637 每一个函数被调用时,都会为函数开辟一块空间,这块空间就称为栈帧. 首先,我们了解一下不同种类的寄存器: (1)eax,ebx,ecx,edx :通用寄存器 (2)ebp:存放指向函数栈帧栈底的地址 (3)esp:存放指向函数栈帧栈顶的地址 (4)eip:程序计数器——保存程序当前正在执行指令的下一个指令的地址 接着我们以下面这段代码为例,深入到函数的调用过程中去: #

c语言中的函数

函数注意事项在设计中:函数在设计的时候应该尽可能的单一出口或者单一入口,因为它可以让我们更加的容易读取和有关功能的分类. 1.函数的定义:函数一块代码,接受一个或者多个参数,做一件事情,并且返回0个或者多个值. 可以类比:成为数学中的函数,我们输入多个参数并且将会输出相对应的值,这其中的过程就像我们数学中的函数里面处理的过程. 2.函数定义: 返回类型 函数名 (参数,--)  //函数头 { //函数体 } eg:int sum (int first, int second) { return

(转载)你好,C++(27)在一个函数内部调用它自己本身 5.1.5 函数的递归调用

你好,C++(27)在一个函数内部调用它自己本身 5.1.5 函数的递归调用 5.1.5 函数的递归调用 在函数调用中,通常我们都是在一个函数中调用另外一个函数,以此来完成其中的某部分功能.例如,我们在main()主函数中调用PowerSum()函数来计算两个数的平方和,而在PowerSum()函数中,又调用Power()函数和Add()函数来计算每个数的平方并将两个平方加和起来成为最终的结果.除此之外,在C++中还存在另外一种特殊的函数调用方式,那就是在一个函数内部调用它自己本身,这种方式也被

你好,C++(27)在一个函数内部调用它自己本身 5.1.5 函数的递归调用

5.1.5 函数的递归调用 在函数调用中,通常我们都是在一个函数中调用另外一个函数,以此来完成其中的某部分功能.例如,我们在main()主函数中调用PowerSum()函数来计算两个数的平方和,而在PowerSum()函数中,又调用Power()函数和Add()函数来计算每个数的平方并将两个平方加和起来成为最终的结果.除此之外,在C++中还存在另外一种特殊的函数调用方式,那就是在一个函数内部调用它自己本身,这种方式也被称为函数的递归调用. 函数的递归调用,实际上是实现函数的一种特殊方式.当递归函