我们知道,如果要加载一个很耗时的操作,会阻塞主线程,这时我们可以想到开启一个新的线程,避免阻塞,在android中也有这样的问题,我们可以用异步任务来操作,异步任务也是开启一个线程,线程里面发一个消息,然后通知去改变UI。
Android开发_异步加载网络图片_异步任务加载网络图片_线程加载图片
废话不多说,我们先看一个例子:我们可以打开这个网址:http://img1.3lian.com/img2011/07/20/05.jpg可以看到一副很好看的图片,我们就要把这个图片显示出来,首先,还是先要布局,我们要显示一幅图片,所以我们的布局中需要一个ImageView,布局很简单,一个ImageView就可以了:
android:layout_width="match_parent" android:layout_height="match_parent">
android:layout_width="match_parent" android:layout_height="match_parent"/>
之后我们要写一个Activity显示这个图片,不过要加载网络上的图片,我们需要从一个URL的流中获取这个图片,所以我们要写一个方法来获取这张图片:
1 publicDrawable loadImages(String url) {2 try{3 returnDrawable.createFromStream((InputStream)(newURL(url)).openStream(),"test");4 }5 catch(IOException e) {6 e.printStackTrace();7 }8 returnnull;9 }
从URL中打开流,强制转换成InputStream,然后从流中拿到Drawable。
既然可以获取图片了,我们要考虑一个问题,如果图片很大,加载的很慢怎么办,我们岂不是要等很久?不要紧,这时候我们就可以用异步任务了。
首先我们要写一个内部类,这个类部类是继承自异步任务的,需要重载里面的doBackGround方法:
1
private class ImageAsynTask extends AsyncTask {
@Override
protected Drawable doInBackground (Void... params) {
String url = "http://img1.3lian.com/img2011/07/20/05.jpg";
return loadImages(url);
}
@Override
protected void onPostExecute (Drawable result) {
super.onPostExecute(result);
mDialog.dismiss();
mImage.setImageDrawable(result);
}
@Override
protected void onPreExecute () {
super.onPreExecute();
mDialog.show();
}
}
@Override
protected void onDestroy () {
super.onDestroy();
mDialog.dismiss();
}
return null;
}
首先看这个方法:onPreExecute()这个方法是在doInBackGround前面执行。我们把这个方法写出来,我们需要在获取图片之
前等待的时间里,写一个progressDialog,显示出来,提示用户,目前正在加载图片,需要等待一段时间。同时在后台操作
doBackGround运行。
在doBackGround完成之后就会执行onPostExecute(Drawable
result)方法,看这个方法就知道,必须在doBackGround完成之后,把得到的结果Drawable作为参数传到onPostExecute
方法里面去,执行这个方法就表示已经加载完了,我们需要将progressDialog消失掉,然后把图片显示出来就可以了,整个过程很简单。
看下整个Activity的代码:
package com.test.asyntask;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.ImageView;
import com.test.R;
public class AsynTask extends Activity {
private
ImageView mImage;
private
ProgressDialog mDialog;
@Override
protected
void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.asyn_task);
mDialog = new ProgressDialog(this);
mDialog.setTitle("请稍等");
mDialog.setMessage("正在加载...");
mImage = (ImageView) findViewById(R.id.img);
new ImageAsynTask().execute();
}
private
class ImageAsynTask extends AsyncTask
Drawable> {
@Override
protected Drawable doInBackground (Void... params) {
String url = "http://img1.3lian.com/img2011/07/20/05.jpg";
return loadImages(url);
}
@Override
protected void onPostExecute (Drawable result) {
super.onPostExecute(result);
mDialog.dismiss();
mImage.setImageDrawable(result);
}
@Override
protected void onPreExecute () {
super.onPreExecute();
mDialog.show();
}
}