我正在为我创建的每个班级从AsynTask中的Web服务器抓取缩略图。对于这个特殊问题,我在ListView中显示缩略图和一些文本属性。
问题在于它非常慢。我考虑在第一次需要时将每个图像保存到设备,然后每隔一次,我可以从数据库中取出它。我不确定这是否理想,因为服务器上的图像可能会更新,也可能不会更新。在我看来,我觉得最好总是抓住图像,以防万一有新的图像可以抓住。
我想向所有优秀人士提出一些建议。
注意:我也尝试在ListView适配器中获取图像,但1)每次滚动ListView时都会获取每个图像; 2)因为每个图像下载时都会出现错误的错误我可以看到图像出现在错误的列表视图项目中,然后它会在一段时间后神奇地纠正自己。这根本不是理想的,这就是我将代码移到课堂上的原因。
我很感激任何有关我的方式的建议。
这里是生活在课堂上的形象的吸气剂。这在第一次下载图像后工作正常,但在初始运行期间不太好。
public Bitmap GetThumbnail_xlarge() throws Exception {
if(_thumbnail_xlarge == null ) {
if( _thumbnailBasePath != null) {
try {new DownloadImageTask(_thumbnail_xlarge).execute(_thumbnailBasePath + "/portrait_xlarge." + _thumbnailExtension); }
catch (Exception e) {} //TODO: The extension could be incorrect. Do nothing for now.
}
else{ throw new Exception("You must set the thumbnail path before getting the image"); }
}
return _thumbnail_xlarge;
}
而且,这是完成工作的班级。请注意,这是图像属性所在的类中的私有类:
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
Bitmap bmImage;
public DownloadImageTask(Bitmap bmImage) {
this.bmImage = bmImage;
}
protected Bitmap doInBackground(String... urls) {
String urldisplay = urls[0];
Bitmap mIcon11 = null;
try {
InputStream in = new java.net.URL(urldisplay).openStream();
mIcon11 = BitmapFactory.decodeStream(in);
} catch (Exception e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
return mIcon11;
}
protected void onPostExecute(Bitmap result) { _thumbnail_xlarge = result; }
}
我无法想到此时可能相关的任何其他内容。如有必要,请向我询问更多信息,并提前致谢!
答案 0 :(得分:2)
将图像保存在本地供以后使用非常有用。这称为缓存。这很有用,因为您正在节省资源,并且可以减少使用大量资源的网络请求。
如果图像很大,您可以使用WebP格式。 WebP是一种图像格式,“对网络上的图像进行无损和有损压缩。与PNG相比,WebP无损图像的尺寸缩小了26%。与等效SSIM索引的JPEG图像相比,WebP有损图像的尺寸缩小了25-34% “。 有关WebP格式的更多信息,请访问:https://developers.google.com/speed/webp/?csw=1
此外,如果要在ListView上平滑加载图像,则必须使用ViewHolder模式。更多信息:http://developer.android.com/training/improving-layouts/smooth-scrolling.html#ViewHolder