使用AsyncTask实现图片加载

时间:2023-03-08 16:11:46

使用AsyncTask实现图片加载使用AsyncTask实现图片加载

如上图所示:我们看到的就是使用PrograssDialog进度条和AsyncTask异步任务实现的效果(额,不要看应用名。。。)。下面介绍一下具体的实现流程。

一、首先使用XML布局,布局很简单直接上代码:

 <RelativeLayout 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="com.weifengzz.httpclientdemo.MainActivity$PlaceholderFragment" > <Button
android:id="@+id/getImage_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/img"
android:layout_marginTop="22dp"
android:text="获取图片" /> <ImageView
android:id="@+id/img"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:scaleType="fitCenter"
android:src="@drawable/ic_launcher" /> </RelativeLayout>

二、MainActivity类主要就是对组件的初始化。

 public class MainActivity extends Activity {
private Button button = null;// 按钮
private ImageView imageView = null;// 图片
private ProgressDialog progressDialog = null;// 进度条
private String imgPath = "http://images.ent.xunlei.com/660x1500/189/120818zknfkvg2vtpupxyjdruovsafnj7mbmikn5yh7mpe.jpg";// 图片的地址
private DownLoadImage downLoadImage = null;// AsyncTask异步任务类 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intView();
//点击加载图片
button.setOnClickListener(new OnClickListener() { @Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
downLoadImage.execute(imgPath);
}
});
} /**
* 初始化组件
* */
private void intView() {
button = (Button) findViewById(R.id.getImage_btn);
imageView = (ImageView) findViewById(R.id.img);
progressDialog = new ProgressDialog(MainActivity.this);
downLoadImage = new DownLoadImage(imageView, progressDialog);
}
}

三、DownLoadImage类的实现,此类继承了 AsyncTask异步任务类

 public class DownLoadImage extends AsyncTask<String, Integer, byte[]> {
private ProgressDialog progressDialog = null;//进度条
private ImageView iv = null; //图片控件 public DownLoadImage(ImageView imageView,ProgressDialog progressDialog) {
this.progressDialog = progressDialog;
this.iv = imageView;
} /**
* 首次调用的方法,通常我们在此方法中可以初始化一些组件
*/
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
progressDialog.setTitle("下载");//设置标题
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//设置样式
progressDialog.setMessage("正在加载,请稍后...");//设置显示的文字
progressDialog.show();
} /**
* 执行耗时的操作,请求网络数据 String... params:可变的数组
*/
@Override
protected byte[] doInBackground(String... params) {
// TODO Auto-generated method stub
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
int temp = 0;
//使用HttpClient获取数据
HttpClient httpClient = new DefaultHttpClient();
HttpGet hg = new HttpGet(params[0]);
try {
HttpResponse httpResponse = httpClient.execute(hg);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
InputStream inputStream = httpResponse.getEntity().getContent();
long length = httpResponse.getEntity().getContentLength();
int current = 0;
//每次读10个字节,如果读的字节数据比较多的话,进度条会显示的不是那么流畅,会有很大的跳跃感
byte[] bt = new byte[10];
//循环读取数据
while ((temp = inputStream.read(bt)) != -1) {
//如果没有取消就每循环一次更新一次进度条
if (!this.isCancelled()) {
current += temp;
publishProgress((int) ((current / (float) length) * 100));
//输出流
outputStream.write(bt, 0, temp);
}
}
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return outputStream.toByteArray();
} /**
* 调用完publishProgress之后会执行此方法,更新刻度
*/
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
progressDialog.setProgress(values[0]);
} /**
* 运行在UI线程中 执行完doInbackgroud方法之后,系统会调用此方法, 并且把doInbackground方法返回的结果传给此方法
*/
@Override
protected void onPostExecute(byte[] result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
// 把byte数组转成Bitmap位图对象
Bitmap bitmap = BitmapFactory.decodeByteArray(result, 0, result.length);
iv.setImageBitmap(bitmap);
// 关闭对话框
progressDialog.dismiss();
}
}

四、最后不要忘记添加网络权限

   <uses-permission android:name="android.permission.INTERNET"/>