您的位置:首页 > 理论基础 > 计算机网络

android异步加载网络图片(1)

2016-03-28 22:47 423 查看
说到异步加载,就会想到Thread,AsyncTask;

说到连接网络,可以使用HttpURLConnection,HttpClick

不多说什么,直接在代码中讲解吧。

1,先创建一个网络连接工具类HttpUtil,里面有两个方法,一个使用HttpURLConnection网络连接获取图片,另外一个使用HttpClick连接网络获取图片。

(1)使用:HttpURLConnection

public static Bitmap getHttpURLConnectionBitmap(String address) {
Bitmap bitmap;
InputStream inputStream = null;
BufferedInputStream bufferedInputStream = null;
try {
URL url=new URL(address);
HttpURLConnection connection= (HttpURLConnection) url.openConnection();
inputStream=connection.getInputStream();
bufferedInputStream=new BufferedInputStream(inputStream);
bitmap= BitmapFactory.decodeStream(bufferedInputStream);
connection.disconnect();//关闭
return  bitmap;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
bufferedInputStream.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}


(2)使用HttpClick:

public  static Bitmap getHttpClickBitmap(String address) throws IOException {
HttpClient httpClient =new DefaultHttpClient();
HttpGet httpGet=new HttpGet(address);//Get 请求
HttpResponse httpResponse = null;
try {
httpResponse = httpClient.execute(httpGet);
if (httpResponse.getStatusLine().getStatusCode()==200) {
//请求成功
HttpEntity entity = httpResponse.getEntity();
byte[] data = new byte[1024];
data = EntityUtils.toByteArray(entity);
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
return bitmap;
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}


2,上面已经把网络获取图片工具类写好了,现在就在MainActivity类中写异步加载网络图片,因为加载网络图片时更新UI是不能在主线程操作的,所以我们开辟一个线程Thread或创建一个类继承AsyncTask。

(1)在MainActivity里面写一个showImageViewbyThread(String url)方法,更新UI的是一张图片,返回类型是Bitmap。

public Handler mHandel=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Bitmap bitmap= (Bitmap) msg.obj;
//更新UI
mImageView.setImageBitmap(bitmap);

}
}
};

/*
*url 图片的地址
*/
public Bitmap showImageViewbyThread(String url){
//线程
new Thread(){
@Override
public void run() {
super.run();
//通过网络获取图片
Bitmap bitmap=getHttpURLConnectionBitmap(url);
Message message=Message.obtain();
message.obj=bitmap;
//通过handle发送消息
mHandel.sendMessage(message);
}
}.start();
}


(2)使用AsyncTack:在activity新建一个内部类继承AsyncTack,重写里面的父类的方法

/*
*String 图片的URL地址
*Bitmap 返回一张图片
*/
class HttpImageAsyncTack extends AsyncTack<String,Void,Bitmap>{
/*
后台线程操作
*/
@Override
protected Bitmap doInBackground(String... params) {
String param=params[0];
Bitmap bitmap=null;
try {
bitmap=HttpUtil.getHttpClickBitmap(param);
return  bitmap;
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}
/*
改变UI
*/
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
//显示图片
mImageView.setImageBitmap(bitmap);
}
}


3,最后就在activity的onCreate()方法里面调用

如果使用第2(1)Thread的话

showImageViewbyThread(url);


如果使用2(2)AsyncTack的话

new HttpImageAsyncTack ().execute(url);


今天暂时更时到这里。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: