AsyncTask的用法 asynctask的方法

匿名线程的方式是存在缺陷的:第一,线程的开销较大,如果每个任务都要创建一个线程,那么应用程序的效率要低很多;第二,线程无法管理,匿名线程创建并启动后就不受程序的控制了,如果有很多个请求发送,那么就会启动非常多的线程,系统将不堪重负。另外,前面已经看到,在新线程中更新UI还必须要引入handler,这让代码看上去非常臃肿。

为了解决这一问题,OPhone在1.5版本引入了AsyncTask。AsyncTask的特点是任务在主线程之外运行,而回调方法是在主线程中执行,这就有效地避免了使用Handler带来 的麻烦。阅读AsyncTask的源码可知,AsyncTask是使用java.util.concurrent框架来管理线程以及任务的执行的,concurrent框架是一个非常成熟,高效的框架,经过了严格的测试。这说明AsyncTask的设计很好的解决了匿名线程存在的问题。
AsyncTask是抽象类,子类必须实现抽象方法doInBackground(Params... p),在此方法中实现任务的执行工作,比如连接网络获取数据等。通常还应该实现onPostExecute(Resultr)方法,因为应用程序关心的结果在此方法中返回。需要注意的是AsyncTask一定要在主线程中创建实例。AsyncTask定义了三种泛型类型Params,Progress和Result。

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

AsyncTask的执行分为四个步骤,与前面定义的TaskListener类似。每一步都对应一个回调方法,需要注意的是这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。在任务的执行过程中,这些方法被自动调用。

* onPreExecute()当任务执行之前开始调用此方法,可以在这里显示进度对话框。
* doInBackground(Params...)此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress...)来更新任务的进度。
*onProgressUpdate(Progress...)此方法在主线程执行,用于显示任务执行的进度。
* onPostExecute(Result)此方法在主线程执行,任务执行的结果作为此方法的参数返回。

三个泛型参数:
Param 任务执行器需要的数据类型
Progress 后台计算中使用的进度单位数据类型
Result 后台计算返回结果的数据类型
有些参数是可以设置为不使用的,只要传递为Void型即可,比如AsyncTask</VOID,>

四个步骤:
onPreExecute(),执行预处理,它运行于UI线程,可以为后台任务做一些准备工作,比如绘制一个进度条控件。
doInBackground(Params…),后台进程执行的具体计算在这里实现,doInBackground(Params…)是AsyncTask的关键,此方法必须重载。在这个方法内可以使用publishProgress(Progress…)改变当前的进度值。
onProgressUpdate(Progress…),运行于UI线程。如果在doInBackground(Params…)中使用了publishProgress(Progress…),就会触发这个方法。在这里可以对进度条控件根据进度值做出具体的响应。
onPostExecute(Result),运行于UI线程,可以对后台任务的结果做出处理,结果就是doInBackground(Params…)的返回值。此方法也要经常重载,如果Result为null表明后台任务没有完成(被取消或者出现异常)。

这4个方法都不能手动调用。而且除了doInBackground(Params…)方法,其余3个方法都是被UI线程所调用的,所以要求:
1) AsyncTask的实例必须在UI thread中创建;
2) AsyncTask.execute方法必须在UI thread中调用;

Task只能被执行一次,多次调用时将会出现异常,而且是不能手动停止。

packagecn.asyn.rxm;

importandroid.app.Activity;

importandroid.os.AsyncTask;

importandroid.os.Bundle;

importandroid.util.Log;

importandroid.widget.TextView;

public classAsynctaskActivity extends Activity {

TextView tv;

final String TAG="AsyncTaskTest";

@Override

protected void onCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

tv =(TextView) findViewById(R.id.label);

newMyTask().execute(6, 12, 7);

}

class MyTask extendsAsyncTask<Integer, Integer, Integer>{

@Override

protectedvoid onPreExecute() {

super.onPreExecute();

Log.d(TAG,"onPreExecute()");

}

@Override

protectedInteger doInBackground(Integer... params) {

Log.d(TAG,"doInBackground()");

int p = 0;

for (int index = 0; index< params.length; index++) {

int num = params[index];

for (int j = 0; j < num; j++){

if (num -j <= 0) {

break;

}

p++;

publishProgress(p);

try{

Thread.sleep(500);

} catch(InterruptedException e) {

e.printStackTrace();

}

}

}

return p;

}

@Override

protectedvoid onProgressUpdate(Integer... progress) {

Log.d(TAG,"onProgressUpdate()");

tv.append("nProgress: " +progress[0]);

}

@Override

protectedvoid onPostExecute(Integer result) {

Log.d(TAG,"onPostExecute()");

tv.append("nFinished.Result: " + result);

}

@Override

protectedvoid onCancelled() {

super.onCancelled();

Log.d(TAG,"onCancelled()");

}

}

}

  

爱华网本文地址 » http://www.aihuau.com/a/25101016/299502.html

更多阅读

QQ批量克隆好友的方法 怎么克隆qq好友

QQ批量克隆好友的方法——简介当我们重新申请QQ号,如果一个一个再将原来的好友重新添加回来,那一定是个浩大的工程。下面我将介绍一下如何批量添加好友。QQ批量克隆好友的方法——工具/原料QQ5.2Q

男士去黑头最有效的方法 男士去黑头哪款好

很多男士是不是因为有黑头而觉得很没脸见人呢?这次就来跟各位介绍几招,让你轻松解决掉黑头这个大难题。男士去黑头用什么好?男士去黑头最有效的方法有哪些?黑头到底是什么?  黑头其实就是角质栓塞的一种情况,毛孔中分泌的过剩油脂

去痘印最有效的方法,5个去痘印个偏方 最有效去痘印方法

去痘印最有效的方法,5个去痘印个偏方——简介通常抗痘的战争后,都会留下痕迹——痘印,就像是勇敢的战士们上战场回来后会留下光荣的伤疤。可是痘印的存在却是让女生们都无法直视自己的脸,那么如何消灭脸上的痘印呢?让小编教你几个有效的

是戒烟最好最快的方法是什么? 中药戒烟最好的方法

是戒烟最好最快的方法是什么?——简介常吸烟的人突然戒烟就会出现烦躁不安、头昏头痛、失眠忧虑、咳嗽多汗、心率下降、食欲或体重增加等一系列的不适感。所以为了减少吸烟对自己和家人的危害,请尽量少抽烟或者去戒烟。是戒烟最好最

声明:《AsyncTask的用法 asynctask的方法》为网友漃寞煙錇謌分享!如侵犯到您的合法权益请联系我们删除