android.os.AsyncTask<Params,Progress,Result>
为什么会有AsyncTask类
1、为了解决主线程中的耗时操作,防止主线程出现ANR。完整类名:android.os.AsyncTask<Params, Progress, Result>
是一个抽象类,通常被继承。
Params:任务执行时,所需要的参数
Progress:后台任务执行时返回的进度值
Result:后台任务执行完成后,返回的结果值
构建AsyncTask子类的回调方法
doInBackground:必须重写,异步执行后台线程将要完成的任务
onPreExecute:执行后台耗时操作前被调用,通常用户完成一些初始化操作
onPostExecute: 当doInBackground()完成后,系统会自动调用
onProgressUpdate: 在doInBackground()方法中调用publishProgress()方法中调用publishProgress
更新任务的执行进度后,就会触发该方法。
AsyncTask的执行顺序:
onPreExecute--->doInBackground(调用publishProgress方法后)--->onProgressUpdate--->onPostExecute
在主线程中创建AsyncTask<Params,Progress,Result>的子类,调用execute方法。
例子:通过AsyncTask异步加载网络图片
MainActivity.java
package lzl.edu.com.asynctaskdemo;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class MainActivity extends Activity {
private ImageView mImage;
private Button mBtn_getImage;
private ProgressBar mPb;
public static final String IMAGE_URL =
"http://img.firefoxchina.cn/2015/10/5/201510221522590.jpg";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImage = (ImageView)findViewById(R.id.myImage);
mBtn_getImage = (Button)findViewById(R.id.btn_getImage);
mPb = (ProgressBar)findViewById(R.id.pb);
mBtn_getImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new getImageAsyncTask().execute(IMAGE_URL);
}
});
//定义一个一步操作的实现类,在非主线程中进行一些耗时的操作
}
//定义一个异步任务,来完成网络图片的获取。并且显示加载图片的进度条。
class getImageAsyncTask extends AsyncTask<String,Void,Bitmap>{
//用户点击访问图片之后,显示进度条
@Override
protected void onPreExecute() {
super.onPreExecute();
mPb.setVisibility(View.VISIBLE);
}
@Override
protected Bitmap doInBackground(String... params) {
Bitmap bitmap = null;
try {
//模拟耗时工作
Thread.sleep(5000);
//将String类型的地址,转换成URL路径
Log.i("comde",params[0]);
URL url = new URL(params[0]);
HttpURLConnection connection =(HttpURLConnection)url.openConnection();
//设置超时时间
connection.setReadTimeout(5000);
Log.i("comde",""+connection.getResponseCode());
//如果访问码==200表示访问成功
if(connection.getResponseCode() == 200){
InputStream is = connection.getInputStream();
//将获取的输入流,转换成Bitmap对象
bitmap = BitmapFactory.decodeStream(is);
}
}catch (Exception e){
e.printStackTrace();
}
return bitmap;
}
//返回结果是图片,并让进度条消失
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
//让进度条消失
mPb.setVisibility(View.GONE);
//让图片显示
mImage.setVisibility(View.VISIBLE);
mImage.setImageBitmap(bitmap);
}
}
}
ProgressBarActivity.java
package lzl.edu.com.asynctaskdemo;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.ProgressBar;
public class ProgressBarActivity extends Activity {
android.widget.ProgressBar mPb_pb;
MyAsyncTask mTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_progress_bar);
mPb_pb = (ProgressBar)findViewById(R.id.pb_pb);
mTask = new MyAsyncTask();
mTask.execute();
}
@Override
protected void onPause() {
super.onPause();
//当activity停止时,判断异步任务是否正在运行。如果正在运行,设置成cancel。然后在异步任务操作时调用
if(mTask!=null&&mTask.getStatus() == AsyncTask.Status.RUNNING){
mTask.cancel(true);
}
}
class MyAsyncTask extends AsyncTask<Void,Integer,Void>{
@Override
protected Void doInBackground(Void... params) {
try{
for(int i=0;i<100;i++){
//每次进行异步操作时,判断该任务是否被取消。
if(isCancelled()){
break;
}
Thread.sleep(30);
publishProgress(i);
}
}catch (Exception e){
e.printStackTrace();
}
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
Log.i("values",values[0]+"");
mPb_pb.setProgress(values[0]);
}
}
}