当前位置:首页 » 安卓系统 » android异步加载网络图片

android异步加载网络图片

发布时间: 2024-09-30 09:13:04

❶ android 如何获取远程文件的内所有图片

大家都知道,在android应用中UI线程5秒没响应的话就会抛出无响应异常,对于远程获取大的资源来说,这种异常还是很容易就会抛出来的,那么怎么避免这种问题的产生。在android中提供两种方法来做这件事情:
启动一个新的线程来获取资源,完成后通过Handler机制发送消息,并在UI线程中处理消息,从而达到在异步线程中获取图片,然后通过Handler Message来更新UI线程的过程。
使用android中提供的AsyncTask来完成。

具体的做法这里就不介绍了,查下API就可以了,或者是google、下。这里主要来说本地缓存
本地缓存
对于图片资源来说,你不可能让应用每次获取的时候都重新到远程去下载(ListView),这样会浪费资源,但是你又不能让所有图片资源都放到内存中去(虽然这样加载会比较快),因为图片资源往往会占用很大的内存空间,容易导致OOM。那么如果下载下来的图片保存到SDCard中,下次直接从SDCard上去获取呢?这也是一种做法,我看了下,还是有不少应用采用这种方式的。采用LRU等一些算法可以保证sdcard被占用的空间只有一小部分,这样既保证了图片的加载、节省了流量、又使SDCard的空间只占用了一小部分。另外一种做法是资源直接保存在内存中,然后设置过期时间和LRU规则。
sdcard保存:

在sdcard上开辟一定的空间,需要先判断sdcard上剩余空间是否足够,如果足够的话就可以开辟一些空间,比如10M
当需要获取图片时,就先从sdcard上的目录中去找,如果找到的话,使用该图片,并更新图片最后被使用的时间。如果找不到,通过URL去download
去服务器端下载图片,如果下载成功了,放入到sdcard上,并使用,如果失败了,应该有重试机制。比如3次。
下载成功后保存到sdcard上,需要先判断10M空间是否已经用完,如果没有用完就保存,如果空间不足就根据LRU规则删除一些最近没有被用户的资源。
关键代码:
保存图片到SD卡上

❷ Android客户端访问网络时,volley与okHttp,哪一个更好

OkHttp
物理质量
使用OkHttp需要 okio.jar (80k), okhttp.jar(330k)这2个jar包,总大小差不多400k,加上自己的封装,差不多得410k。
功能介绍
Square 公司开源的 OkHttp 是一个专注于连接效率的 HTTP 客户端。OkHttp 提供了对 HTTP/2 和 SPDY 的支持,并提供了连接池,GZIP 压缩和 HTTP 响应缓存功能。
优点
支持http请求,https请求。
支持文件下载。
使用的是HttpURLConnection,不要担心android版本的变换。(至少目前是都支持的)。
支持get,post请求。
基于Http的文件上传
加载图片。
缺点
比如callback回来是在线程里面, 不能刷新UI,需要我们手动处理。
封装比较麻烦。
Volley
物理质量
使用Volley 需要Volley.jar(120k),加上自己的封装最多140k。
功能简述
Volley是Goole在2013年Google I/O大会上推出了一个新的网络通信框架,它是开源的。Volley 的特点:特别适合数据量小,通信频繁的网络操作。
优点
非常适合进行数据量不大,但通信频繁的网络操作。
内部分装了异步线程。
支持get,post网络请求。
图片下载。
可直接在主线程调用服务端并处理返回结果。
可以取消请求,容易扩展,面向接口编程
缺点
对大文件下载 Volley的表现非常糟糕。
只支持http请求。
在BasicNetwork中判断了statusCode(statusCode < 200 || statusCode > 299),如果合条件直
图片加载性能一般。
使用的是httpclient,HttpURLConnection。不过在android 6.0不支持httpclient了,如果想支持得添加org.apache.http.legacy.jar。
总结
在我们当前的项目 xxxSDK,xxx商城里面,使用volley就可以了,毕竟经过了日活几十万的测试,至少稳定性是没有问题的。okhttp暂时还用不上。后续如果要使用okhttp,可以再深入okhttp,给项目做重构。
不过既然转战Android studio,网络请求还是推荐使用Retrofit2
Retrofit 是在OkHttp上封装的,可以参考下 Volley vs Retrofit
http://blog.csdn.net/hwz2311245/article/details/46845271

❸ android listview viewholder 错乱怎么解决代码

在没有用viewHolder的情况下,listView表现效率低下。如果加载的数量过多则会一点点的消耗内存,直到抛出oom。开始异步加载图片会出现图片错位的问题,后来查阅资料将holder里边的图片地址和图片一一对应起来,在异步加载的回调函数中将其替换回来。

holder.thumb_image.setTag(hotel.getHotelTitlePic());
//避免图标错位,在异步加载成功后替换回来

ImageView imageView = (ImageView) listView.findViewWithTag(imageUrl);

if(imageView != null){

imageView.setImageDrawable(imageDrawable);
imageView.setTag("");

}
以上关键代码解决图片错位问题。

下面是getView()方法

public View getView(int position, View rowView, ViewGroup parent){
final
MHotelInfo hotel = this.getItem(position);
if (rowView == null) {
holder =
new ViewHolder();
LayoutInflater inflater = ((Activity)
this.getContext())
.getLayoutInflater();
rowView =
inflater.inflate(R.layout.hotel_item_view, null);

holder.typeName =
(TextView) rowView.findViewById(R.id.hotelType);

holder.thumb_image=(ImageView)rowView.findViewById(R.id.img);// 缩略图

holder.distance = (TextView) rowView.findViewById(R.id.distance);

rowView.setTag(holder);
}else{
holder = (ViewHolder)
rowView.getTag();
}

// 设置ListView的相关值

holder.thumb_image.setTag(hotel.getHotelTitlePic());
//避免图标错位,在异步加载成功后替换回来

holder.typeName.setText(hotel.getTypeName());

if(null ==
hotel.getHotelTitlePic() || hotel.getHotelTitlePic().equals("")){
//如果没有图标就显示默认图标

holder.thumb_image.setImageResource(R.drawable.downloadfalse);

}else{
//异步加载图片

imageLoader.loadDrawable(hotel.getHotelTitlePic(), new ImageCallback() {

public void imageLoaded(Drawable imageDrawable, String imageUrl) {

ImageView imageView = (ImageView) listView.findViewWithTag(imageUrl);

if(imageView != null){

imageView.setImageDrawable(imageDrawable);
imageView.setTag("");

}
}
});
}

return
rowView;
}

static class ViewHolder {
TextView
typeName;
ImageView thumb_image;
}

但是ViewHolder为什么是被设计成static类型的,本人一直没弄清楚。在网上找了些资料但是一直没能看到一个能说服我的理由。又说节省内存,保持对象的唯一性,还有说保持图片不错乱但是个人感觉都不怎么靠谱。今天我试了下将static去掉照常运行没感觉和以前有什么区别。后来我查了下static类的一些特性,首先ViewHolder是一个内部类若是static类的话则不需要依赖外部类的对象。也就是说只有static的内部类的成员变量才可以被声明成static类型,若内部类不是static类型的则不可以声明静态成员变量。不知道是不是static内部类的这个特性吸引了设计者?如果有谁清楚这个问题还请不吝赐教。

热点内容
oracle添加sql 发布:2024-11-24 12:47:10 浏览:141
sql2000sp4安装 发布:2024-11-24 12:43:14 浏览:836
android调节屏幕亮度 发布:2024-11-24 12:35:54 浏览:897
神力科莎要什么电脑配置 发布:2024-11-24 12:19:11 浏览:841
安卓和ios对接有什么不同 发布:2024-11-24 11:49:22 浏览:312
c语言读取文件并输出 发布:2024-11-24 11:42:45 浏览:622
打开u盘拒绝访问 发布:2024-11-24 11:32:07 浏览:488
数据库缩略 发布:2024-11-24 10:54:18 浏览:598
uniqidphp 发布:2024-11-24 10:54:15 浏览:659
linux设备驱动程序pdf 发布:2024-11-24 10:40:26 浏览:807