1.概述
AsyncTask是android提供的轻量级的异步类,实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.
AsyncTask,用起来简单,过程也可控制,但是多个异步类对同一个UI进行操作时,过程变得复杂(不像Handler使用队列,不会出现多个同时执行)。
2.使用AsyncTask
(1).继承AsyncTask,覆写相应的方法
1).继承AsyncTask
/* AsyncTask定义了三种泛型类型 Params,Progress和Result Params 启动任务执行时接收的输入参数,比如要访问网络需要链接,设定为为 String Progress 看台任务执行的进度,比如需要更新一个进度条,设定为Integer Result 后台执行任务执行的结果,比如通过后台想得到一张图片,设定为BitMap */ class MyAsynTask extends AsyncTask<String, Integer, Bitmap>2).覆写相应的方法
//Step 1 //在doInBackground()执行之前调用该方法,主要完成初始化工作。 protected void onPreExecute() {} //Step 2 /* 在onPreExecute方法执行完毕后,执行该方法。 * 比较耗时的操作都可以放在这里,注意这里不能直接操作UI。 * 在执行过程中可以调用publicProgress(Progress…),就会执行异步类中的onProgressUpdate方法,用来更新任务的进度 */ protected Bitmap doInBackground(String... params) {} //Step 2.1 //主要来更新任务进度,只有doInBackground()中调用了publicProgress(Progress…)方法时,才会执行该方法 protected void onProgressUpdate(Integer... values) {} //Step 3 //当于Handler处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主线程执行,任务执行的结果作为此方法的参数返回 protected void onPostExecute(Bitmap result) {} //或者执行当用户取消操作后,后调用该方法 protected void onCancelled() { super.onCancelled(); }(2).实例化子类对象,并调用execute(params)方法
new MyAsynTask().execute(path);
3.应用(完成网络图片传输)
import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import android.os.AsyncTask; import android.os.Bundle; import android.app.Activity; import android.app.ProgressDialog; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; public class MainActivity extends Activity { private Button confirm; private EditText pathText; private ImageView imageView; private ProgressDialog dialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); confirm = (Button) this.findViewById(R.id.confirm); pathText = (EditText) this.findViewById(R.id.path); imageView = (ImageView) this.findViewById(R.id.image); final String path = pathText.getText().toString(); confirm.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { new MyAsynTask().execute(path); } }); } class MyAsynTask extends AsyncTask<String, Integer, Bitmap>{ Bitmap bitmap = null; /* * 在doInBackground()执行之前调用该方法,主要完成初始化工作。 */ @Override protected void onPreExecute() { super.onPreExecute(); dialog = new ProgressDialog(MainActivity.this); dialog.setTitle("请稍后"); dialog.setMessage("正在下载 ..."); dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); dialog.setCancelable(false); dialog.show(); } /* * 在onPreExecute方法执行完毕后,执行该方法。 * 比较耗时的操作都可以放在这里,注意这里不能直接操作UI。 * 在执行过程中可以调用publicProgress(Progress…),就会执行异步类中的onProgressUpdate方法,用来更新任务的进度 */ @Override protected Bitmap doInBackground(String... params) { String path = params[0]; try { HttpURLConnection conn = (HttpURLConnection) new URL(path).openConnection(); conn.setConnectTimeout(3000); conn.setRequestMethod("GET"); if(conn.getResponseCode() == 200){ InputStream in = conn.getInputStream(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); long totalSize = conn.getContentLength(); long currentSize = 0; byte[] bytes = new byte[1024]; int len = -1; while((len=in.read(bytes)) != -1){ currentSize += len; publishProgress((int) ((currentSize/(float)totalSize)*100)); bos.write(bytes, 0, len); } bitmap = BitmapFactory.decodeByteArray(bos.toByteArray(), 0, bos.size()); return bitmap; } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } /* * 主要来更新任务进度 * 只有doInBackground()中调用了publicProgress(Progress…)方法时,才会执行该方法 */ @Override protected void onProgressUpdate(Integer... values) { // TODO Auto-generated method stub super.onProgressUpdate(values); dialog.setProgress(values[0]); } /* * 当于Handler处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主线程执行,任务执行的结果作为此方法的参数返回 */ @Override protected void onPostExecute(Bitmap result) { // TODO Auto-generated method stub super.onPostExecute(result); imageView.setImageBitmap(bitmap); dialog.dismiss(); } /* * 当用户取消操作后,后调用该方法 */ @Override protected void onCancelled() { // TODO Auto-generated method stub super.onCancelled(); } } }