AsyncTask:异步任务。
什么学习异步任务?
1、Android强制规定在主线程(UI线程)不能进行网络连接
2、在子线程中不能更新UI
如何使用异步任务?
1、继承AsyncTask
2、实现doInBackground方法
3、实例化AsyncTask对象
4、执行execute方法
AsyncTask的三个泛型参数
AsyncTask<Params,Progress,Result>
Params 传递的参数的类型,如:String 网络的地址
Progress 进度的类型,如:Integer
Result 返回数据的类型,如:String或List等
PS:如果没有对应数据,定义成Void
AsyncTask的四个方法
Double doInBackground(String... params)
在子线程中进行耗时的操作,如网络连接等 返回值类型为泛型参数类型Result 参数类型为泛型参数Params,可变参数 必须实现
void onPreExecute()
在执行任务前 进行初始化的操作,如初始化进度条 执行在主线程。可选
void onPostExecute(Double result)
在执行任务后进行UI的更新 参数为doInBackground方法的返回值 执行在主线程 可选
void onProgressUpdate(Integer... values)
在执行任务的同时进行进度的更新 参数是doInBackground方法中调用publishProgress方法传递的值 执行在主线程 可选
这次实例是从网络上下载图片。
布局:android_main.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="cn.edu.huse.day8work1.MainActivity" >
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/iv_iamge"
android:layout_gravity="center" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="getImage"
android:text="获得图片"
android:layout_gravity="bottom|center"
android:layout_marginBottom="20dp"/>
</FrameLayout>
MainActivity.java
package cn.edu.huse.day8work1;
import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;
import cn.edu.huse.day8work1.domain.GetImageUtil;
import cn.edu.huse.day8work1.domain.GetImageUtil.OnGetImageCompleteListener;
public class MainActivity extends Activity {
private ImageView iv_image;
private final String url = "https://www.baidu.com/img/bd_logo1.png";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv_image = (ImageView) findViewById(R.id.iv_iamge);
}
public void getImage(View v){
//利用工具类下载图片
GetImageUtil giu = new GetImageUtil(this);
giu.GetImage(url, new OnGetImageCompleteListener() {
@Override
public void OnGetImageComplete(Bitmap bitmap) {
if(bitmap != null){
iv_image.setImageBitmap(bitmap);
}else{
Toast.makeText(MainActivity.this, "图片加载失败", 0).show();
}
}
});
}
}
GetImageUtil.java
package cn.edu.huse.day8work1.domain;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
public class GetImageUtil {
private Context context; //上下文
//图片加载完成接口
public interface OnGetImageCompleteListener{
void OnGetImageComplete(Bitmap bitmap);
}
private OnGetImageCompleteListener mListener;
//获得图片 url 代码图片的地址
public void GetImage(String url,OnGetImageCompleteListener listener){
this.mListener = listener;
//启动异步任务
new MyGetImageTask().execute(url);
}
//构造函数,将上下文传过来
public GetImageUtil(Context context) {
super();
this.context = context;
}
//加载图片的任务
private class MyGetImageTask extends AsyncTask<String,Void,Bitmap>{
//对话框
private ProgressDialog mDialog;
@Override
protected void onPreExecute() {
super.onPreExecute();
//初始化对话框
mDialog = ProgressDialog.show(context, "正在加载", "努力加载中...");
}
@Override
protected Bitmap doInBackground(String... params) {
InputStream inputStream = null;
try {
//1、获取URL params[0] 图片地址
URL url = new URL(params[0]);
//2、通过URL获得HttpURLConnection
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//3、获得输入流
inputStream = conn.getInputStream();
//4、获得Bitmap
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
return bitmap;
} catch (Exception e) {
e.printStackTrace();
}finally{
//关掉流
if(inputStream != null){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
mDialog.dismiss();
//进行接口回调
if(mListener != null){
mListener.OnGetImageComplete(result);
}
}
}
}
写完之后记得一定要加上上网的权限。
运行结果: