您的位置:首页 > 移动开发 > Android开发

Android的多线程与异步任务3-使用AsyncTask快速实现异步任务

2015-09-24 16:25 579 查看
一、什么是AsyncTask?
Android为了降低异步操作开发难度,结合Handler和线程池,提供了AsyncTask。AsyncTask就是一个封装过的后台任务类,顾名思义就是异步任务。他具有可以在后台执行耗时操作,同时可以将执行进度与UI进行同步的优点。
二、如何使用AsyncTask
AsyncTask定义了三种泛型类型params,progress和result。
Params 启动任务执行的输入参数,比如HTTP请求的URL.
Progress后台任务执行的百分比。
Result后台执行任务最终返回的结果,比如String。
AsyncTask方法
必选方法:
doInBackground(Params)后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress...)来更新任务的进度。
onPostExecute(Result)相当于Handler处理UI的方式,在这里面可以使用doInbackground得到的结果处理操作UI。此方法在主线程执行,任务执行的结果作为 此方法的参数返回。
可选方法:
onProgressUpdate(Progress...) 可以使用进度条增加用户体验度。此方法在主线程执行,用于显示任务执行的进度。
onPreExceute() 这里是最终用户调用Exceute时的接口,当任务执行之前开始调用此方法,可以在这里显示进度对话框。
onCancelled()用户调用取消时,要做的操作。
AsyncTask三个状态:pending,running,finished
三、规则
1.AsyncTask必须在主线程中创建
2.execute()只能调用一次
3.execute()必须在主线程执行
4.不要自己调用onPreExecute(),onProstExecute(),doInBackground(),onProgressUpdate()
四、分析AsyncTask的实现原理
五、分析AsyncTask和Handler谁更消耗资源
AsyncTask比Handler更消耗资源
六、什么时候使用AsyncTask,什么时候使用Handler
任务可以被中止,并需要不断和使用时AsyncTask

任务需要被多次重复执行,且和UI交互少时用Handler

七、代码

1.定义layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <EditText android:id="@+id/edittext_www"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
    
    <ProgressBar android:id="@+id/progressbar_www"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    
    <TextView android:id="@+id/textview_www_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    
    <Button android:id="@+id/button_www_update"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="更新"/>


</LinearLayout>



2.java中实现

package com.douzi.treaddemo;


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


public class MemoryActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
handlerTest();
//asyncTaskTest();
}

/**
* 主线程中执行
*/
private void handlerTest(){
Handler handler = new Handler();
handler.postDelayed(mBlockAction,100);
}

private void asyncTaskTest(){
AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>(){


@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
mBlockAction.run();
return null;
}

};
}

private Runnable mBlockAction = new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: