Android中 AsyncTask的使用
在开发过程中经常会用到多线程,开启单独的线程来处理费时的操作,避免阻塞主线程(UI线程)。在子线程中通过Handler类,采用消息机制来更新主线程,和主UI线程进行通信。但是太多的子线程会给系统带来巨大的负担,随之带来一些性能问题。所以出现了AsyncTask。
Android中的AsyncTask类其实就是一个执行大开销的辅助类。其基本思路是:发起一个异步任务,在子线程中进行执行。当任务线程执行过程中,显示一个进度框,可以根据任务的执行情况发出进度来更新UI线程中的进度框,当任务将结果返回到主线程中,此时将进度框关闭。
AsyncTask底层是一个线程池,所以在处理异步任务的数据量特别大的时候,就显得很有优势。
下面介绍AsyncTask类
AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Params,Progress和Result。
Params 启动任务执行的输入参数,比如HTTP请求的URL。
Progress 后台任务执行的百分比。
Result 后台执行任务最终返回的结果
方法:
1.
2. onPostExecute(result) 此方法在主线程执行,任务执行的结果作为此方法的参数返回。
3.
4.
5.
需要注意的地方
1. AsyncTask的实例必须在UIthread中创建.
2.
3. 不要手动的调用onPreExecute(),onPostExecute(result) doInBackground(params…),onProgressUpdate(params…)等方法.
4.
整个流程:
AsyncTask的整个调用过程都是从execute方法开始的(主线程中调用),一旦在主线程中调用execute方法,就会调用onPreExecute方法,在这里可以做一些准备工作,如在界面上显示一个进度条,或者一些控件的实例化.同样也可以通过onProgressUpdate方法给用户一个进度条的显示更新,增加用户体验;最后通过onPostExecute方法,将在doInBackground得到的结果来处理操作UI。doInBackground任务执行的结果作为此方法的参数返回。
- <span style="font-family: KaiTi_GB2312; font-size: 18px;">package irdc.liupan.asynctask;
- import java.io.ByteArrayOutputStream;
- import java.io.InputStream;
- import org.apache.http.HttpEntity;
- import org.apache.http.HttpResponse;
- import org.apache.http.HttpStatus;
- import org.apache.http.client.HttpClient;
- import org.apache.http.client.methods.HttpGet;
- import org.apache.http.impl.client.DefaultHttpClient;
- import android.app.Activity;
- import android.app.Dialog;
- import android.app.ProgressDialog;
- import android.content.Context;
- import android.content.DialogInterface;
- import android.os.AsyncTask;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.TextView;
- public class ASyncTaskTestActivity extends Activity {
- private Button open;
- private TextView text;
- final String TAG = "ASyncTaskTestActivity";
- public class ASyncTaskTest extends AsyncTask<String, Integer, String>{
- @Override
- // 后台执行,比较耗时的操作都可以放在这里。
- // 注意这里不能直接操作UI。通常需要较长的时间。在执行过程中可以调用
- // publishProgress()来更新任务的进度
- protected String doInBackground(String... params) {
- // TODO Auto-generated method stub
- Log.i(TAG, "doInBackground(Params... params) called");
- try {
- HttpClient client = new DefaultHttpClient();
- HttpGet get = new HttpGet(params[0]);
- HttpResponse response = client.execute(get);
- if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
- HttpEntity entity = response.getEntity();
- InputStream is = entity.getContent();
- long total = entity.getContentLength();
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- byte[] buf = new byte[1024];
- int count = 0;
- int length = -1;
- while ((length = is.read(buf)) != -1) {
- baos.write(buf, 0, length);
- count += length;
- //调用publishProgress公布进度,最后onProgressUpdate方法将被执行
- // publishProgress((int) ((count / (float) total) * 100));
- }
- return new String(baos.toByteArray(), "gb2312");
- }
- } catch (Exception e) {
- Log.e(TAG, e.getMessage());
- }
- return null;
- }
- @Override
- // 此方法在主线程执行,任务执行的结果作为此方法的参数被传进来
- protected void onPostExecute(String result) {
- // TODO Auto-generated method stub
- Log.e(TAG, "后台任务执行结束");
- super.onPostExecute(result);
- text.setText(result);
- }
- @Override
- protected void onPreExecute() {
- // TODO Auto-generated method stub
- super.onPreExecute();
- text.setText("后台任务开始执行");
- }
- @Override
- protected void onProgressUpdate(Integer... values) {
- // TODO Auto-generated method stub
- //本函数当调用publishProgress()时会被调用一般在 在doInBackground函数中调用
- //但是这里取到的是一个数组,所以要用values[0]来取值,第n个参数就用values[n]来取值
- super.onProgressUpdate(values);
- }
- @Override
- protected void onCancelled() {
- // TODO Auto-generated method stub
- //当调用task.cancel(boolean)会调用本函数
- super.onCancelled();
- text.setText("后台任务取消");
- }
- }
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- text = (TextView) findViewById(R.id.text);
- open = (Button) findViewById(R.id.btn);
- open.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- new ASyncTaskTest().execute("http://www.baidu.com");
- }
- });
- }
- }</span>