Android 结合实例学会AsyncTask的使用方法

AsyncTask运行时经过四个步骤,运行四个方法:

1.onPreExecute(),执行在UI线程,能够设置或改动UI控件,如显示一个进度条

2.doInBackground,执行在后台线程,不能够设置或改动UI控件,该方法的执行时机是:

onPreExecute()运行完成马上调用该方法,在方法中进行耗时操作,能够在该方法中调用publishProgress方法

来公布当运行的进度,调用publishProgress方法后就会马上触发onProgressUpdate方法

3.onProgressUpdate,执行在UI线程,能够设置或改动UI控件

4.onPostExecute,执行在UI线程,能够设置或改动UI控件,该方法在doInBackground方法执行完成

后就会调用,该方法的參数就是doInBackground方法返回的结果,能够这样思考:doInBackground方法

既然有一个返回结果,那么这个返回结果究竟返回给谁呢?答案就是:通过參数形式传递给onPostExecute方法

參数说明:

1.doInBackground方法的形參相应的是AsyncTask的第一个參数,即參数类型要同样。doInBackground方法

接收实參的时机是:在UI线程中调用execute方法时为execute方法设置值,调用execute方法,这个值就会通过參数形式传给doInBackground方法,doInBackground方法返回的结果相应的是AsyncTask的第三个參数,即參数类型要同样,

2.onPostExecute方法的參数值就是doInBackground方法返回的结果传递过来的。因此onPostExecute方法的參数

类型与AsyncTask的第三个參数也相应。即同样

3.onProgressUpdate方法的參数类型与AsyncTask的第二个參数相应,即參数类型要同样,在doInBackground方法中能够调用

publishProgress方法将进度值传递给onProgressUpdate方法,进度值的类型由AsyncTask的第二个參数类型决定

參数说明小结:

1.AsyncTask的第一个參数类型决定了doInBackground方法、execute方法的參数类型

2.AsyncTask的第二个參数类型决定了publishProgress方法、onProgressUpdate方法的參数类型

3.AsyncTask的第三个參数类型决定了doInBackground方法的返回值类型、onPostExecute方法的參数类型

注:假设不须要參数传递,那么AsyncTask的參数列表能够写成:AsyncTask<Void, Void, Void>

使用AsyncTask类必须遵循的规则:

1.AsyncTask类必须在UI thread载入

2.Task实例必须在UI thread中创建

3.execute方法必须在UI thread中调用

4.不要手动调用onPreExecute、onPostExecute、doInBackground、onProgressUpdate方法

5.该Task仅仅能运行一次,多次调用将会抛出异常

AsyncTask类的使用能够參见AsyncTask源代码凝视部分,当中有具体说明

(原文链接:http://blog.csdn.net/yelangjueqi/article/details/38322647,欢迎转载,转载时请注明出处!!)

展示一个样例:

packagecom.text.asynctaskdemo;

importandroid.app.Activity;

importandroid.os.AsyncTask;

importandroid.os.Bundle;

importandroid.util.Log;

publicclassMainActivity
extends
Activity {

privatestaticfinalString
TAG
= "asynctaskdemo";

@Override

protectedvoidonCreate(Bundle
savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

new
LoadAllAppsTask().execute(
"Test AsyncTask");

}

privateclassLoadAllAppsTask
extends
AsyncTask<String, Integer, Long> {

@Override

protectedvoidonPreExecute()
{

//
TODO
Auto-generated method stub

Log.d(TAG,"onPreExecute");

super.onPreExecute();

}

@Override

protectedLong doInBackground(String... params)
{

//
TODO
Auto-generated method stub

Log.d(TAG,"doInBackground
params[0]="+params[0]);

publishProgress(10);

return100L;

}

@Override

protectedvoidonProgressUpdate(Integer...
values) {

//
TODO
Auto-generated method stub

Log.d(TAG,"onProgressUpdate
values[0]="+ values[0]);

super.onProgressUpdate(values);

}

@Override

protectedvoidonPostExecute(Long
result) {

//
TODO
Auto-generated method stub

Log.d(TAG,"onPostExecute
result="+ result);

super.onPostExecute(result);

}

}

}

输出结果:

06-10 14:17:08.724: DEBUG/asynctaskdemo(7419): onPreExecute

06-10 14:17:08.731: DEBUG/asynctaskdemo(7419): doInBackground params[0]=Test AsyncTask

06-10 14:17:08.771: DEBUG/asynctaskdemo(7419): onProgressUpdate values[0]=10

06-10 14:17:08.771: DEBUG/asynctaskdemo(7419): onPostExecute result=100

doInBackground(String... params)方法的形參列表能够接受多个參数值,以下演示一下,接受多个參数值的过程:

1.execute方法中传入多个參数:

newLoadAllAppsTask().execute("Test AsyncTask",
"Test AsyncTask2","Test AsyncTask3");

2.doInBackground方法中获取第二个參数的值时,直接params[1]就能够取到,获取第三个就使用params[2],例如以下:

protectedLong doInBackground(String... params)
{

//
TODO
Auto-generated method stub

Log.d(TAG,"doInBackground
params[1]="+ params[1]);

publishProgress(10);

return100L;

}

改动之后,执行上面程序,输出结果:

06-10 14:24:57.834: DEBUG/asynctaskdemo(8269): onPreExecute

06-10 14:24:57.843: DEBUG/asynctaskdemo(8269): doInBackground params[1]=Test AsyncTask2

06-10 14:24:57.926: DEBUG/asynctaskdemo(8269): onProgressUpdate values[0]=10

06-10 14:24:57.926: DEBUG/asynctaskdemo(8269): onPostExecute result=100

时间: 2024-10-28 16:01:57

Android 结合实例学会AsyncTask的使用方法的相关文章

Android 结合实例学会AsyncTask的用法

AsyncTask执行时经过四个步骤,执行四个方法: 1.onPreExecute(),运行在UI线程,可以设置或修改UI控件,如显示一个进度条 2.doInBackground,运行在后台线程,不可以设置或修改UI控件,该方法的执行时机是:onPreExecute()执行完毕立即调用该方法,在方法中进行耗时操作,可以在该方法中调用publishProgress方法来发布当执行的进度,调用publishProgress方法后就会立即触发onProgressUpdate方法 3.onProgres

Android必学之AsyncTask基础

AsyncTask,即异步任务,是Android给我们提供的一个处理异步任务的类.通过此类,可以实现UI线程和后台线程进行通讯,后台线程执行异步任务,并把结果返回给UI线程. .为什么需要使用异步任务? 我们知道,Android中只有UI线程,也就是主线程才能进行对UI的更新操作,而其他线程是不能直接操作UI的.这样的好处是保证了UI的稳定性和准确性,避免多个线程同时对UI进行操作而造成UI的混乱.但Android是一个多线程的操作系统,我们总不能把所有的任务都放在主线程中进行实现,比如网络操作

Android必学之AsyncTask

AsyncTask,即异步任务,是Android给我们提供的一个处理异步任务的类.通过此类,可以实现UI线程和后台线程进行通讯,后台线程执行异步任务,并把结果返回给UI线程. .为什么需要使用异步任务? 我们知道,Android中只有UI线程,也就是主线程才能进行对UI的更新操作,而其他线程是不能直接操作UI的.这样的好处是保证了UI的稳定性和准确性,避免多个线程同时对UI进行操作而造成UI的混乱.但Android是一个多线程的操作系统,我们总不能把所有的任务都放在主线程中进行实现,比如网络操作

zygote&amp;AsyncTask的doInBackgroud方法

zygote 有时候会遇到报有关zygote的错,这是个什么东西呢,简单理解就是孵化池. 当每个新的进程启动虚拟机的一个新的实例时,如果每次都加载所有必要的基类,则效率会很低.android把每个应用放在独立的进程中,他会利用底层linux操作系统的fork操作,通过模板进程生成新的进程,该进程在启动新的虚拟机实例时能够达到最优状态,该模板进程的名字就是zygote.zygote模板进程是dalvik虚拟机的一个实例,它包含一组预加载类及zygote进程的其他方法,这些进程通过fork操作生成z

【转】 Android常用实例—Alert Dialog的使用

Android常用实例-Alert Dialog的使用 AlertDialog的使用很普遍,在应用中当你想要用户做出"是"或"否"或者其它各式各样的选择时,为了保持在同样的Activity和不改变用户屏幕,就可以使用AlertDialog. 代码地址 https://github.com/JueYingCoder/AndroidUsefulExample_AlertDialog 这篇文章主要讲解如何实现各种AlertDialog,文章比较长,如果能认真读完,Aler

Android异步加载AsyncTask详解

最近项目发现个重大问题,结果打log跟踪查是AsyncTask导致的.如果对AsyncTask了解的不够深入透彻,那写代码就是埋雷.以后不定在哪个时间爆炸.首先我们要了解,谷歌为什么发明AsyncTask,AsyncTask到底是用来解决什么问题的?Android有一个原则---单线程模型的原则:UI操作并不是线程安全的并且这些操作必须在UI线程中执行. 在单线程模型中始终要记住两条法则: 1. 不要阻塞UI线程 2. 确保只在UI线程中访问Android UI工具包 首先来说说AsyncTas

Android常用实例—Alert Dialog的使用

Android常用实例-Alert Dialog的使用 AlertDialog的使用很普遍,在应用中当你想要用户做出"是"或"否"或者其它各式各样的选择时,为了保持在同样的Activity和不改变用户屏幕,就可以使用AlertDialog. 这篇文章主要讲解如何实现各种AlertDialog,文章比较长,如果能认真读完,AlertDialog的各种用法应该就能掌握了,下面是我们今天要实现的最终效果: 乍一看,在应用中我们见过很多千奇百怪的对话框,但仔细分析,它还是有

Android异步任务处理框架AsyncTask源码分析

[转载请注明出处:http://blog.csdn.net/feiduclear_up CSDN 废墟的树] 引言 在平时项目开发中难免会遇到异步耗时的任务(比如最常见的网络请求).遇到这种问题,我们可以自己通过Handler+Message+Thread/ThreadPool来构造一个异步耗时任务框架.当你下次项目中又遇到一个网络请求,你又不得不重写异步耗时任务处理框架.出于避免开发者重复搬砖工作,Google工程师给开发者搭建了一个通用的异步耗时任务处理框架--AsyncTask. Asyn

[高级]译文:Android中糟糕的AsyncTask

AsyncTask是一个很常用的API,尤其异步处理数据并将数据应用到视图的操作场合.其实AsyncTask并不是那么好,甚至有些糟糕.本文我会讲AsyncTask会引起哪些问题,如何修复这些问题,并且关于AsyncTask的一些替代方案. AsyncTask 从Android API 3(1.5 Cupcake)开始,AsyncTask被引入用来帮助开发者更简单地管理线程.实际上在Android 1.0和1.1也是有类似的实现,那就是UserTask.UserTask和AsyncTask有着相