UIL加载精确图像
我有通用图像加载器的另一个问题。试图在ListView和GridView中使用它来显示大量的图像。传递给UIL的网址包含高分辨率图像。我尝试过使用几乎所有的缩放类型,并且它在移动网络上的加载速度比原来的LazyList慢得多。据我了解,它首先加载确切的图像,然后调整它。有没有办法下载少量的数据来显示这个非常缩放的图像。另外它有时会在加载图像时出现两种不同的例外情况。 EOFException和SocketTimeoutException。任何想法我在这里做错了吗?UIL加载精确图像
更新: 适配器类:
public class LazyAdapter extends BaseAdapter {
private Activity activity;
private List<String[]> data;
private static LayoutInflater inflater=null;
public ImageLoade1r imageLoader;
public boolean show;
public final String webs = "http://www";
public DisplayImageOptions options;
public ImageLoader nostra;
public LazyAdapter(Activity a, List<String[]> d, boolean flag) {
activity = a;
data=d;
show=flag;
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(a.getApplicationContext())
.enableLogging()
.build();
nostra = ImageLoader.getInstance();
nostra.init(config);
options = new DisplayImageOptions.Builder()
.cacheOnDisc()
.showImageOnFail(R.drawable.failed)
.imageScaleType(ImageScaleType.EXACTLY)
.bitmapConfig(Bitmap.Config.RGB_565)
.build();
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
imageLoader=new ImageLoade1r(activity.getApplicationContext());
}
public int getCount() {
return data.size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
View vi=convertView;
String[] url = data.get(position);
if(convertView==null)
vi = inflater.inflate(R.layout.item, null);
TextView text=(TextView)vi.findViewById(R.id.text);;
ImageView image=(ImageView)vi.findViewById(R.id.image);
ProgressBar spinner = (ProgressBar) vi.findViewById(R.id.prgrsItem);
RelativeLayout layo = (RelativeLayout) vi.findViewById(R.id.thelayout);
if(url[1].trim().equals("folder"))
{
String img = webs+url[3].trim() + url[2] +"title"+".jpg";
display(image, img, spinner);
text.setText(url[2].replaceAll("_", " "));
}
else
{
String img;
if(show==true)
img = webs+url[3] + url[2]+"title"+".jpg";
else
img = webs+url[0];
display(image, img, spinner);
text.setText(url[2].replaceAll("_", " "));
}
if(show==true)
{
text.setVisibility(View.VISIBLE);
}
else
{
text.setVisibility(View.GONE);
}
return vi;
}
public void display(ImageView img, String url, final ProgressBar spinner)
{
nostra.displayImage(url, img, options, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
spinner.setVisibility(View.VISIBLE);
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
spinner.setVisibility(View.GONE);
EasyTracker.getTracker().sendException(failReason.toString(), false);
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
spinner.setVisibility(View.GONE);
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
}
});
}
}
更新 EOFException类:
03-21 13:51:55.800: E/ImageLoader(31605): null
03-21 13:51:55.800: E/ImageLoader(31605): java.io.EOFException
03-21 13:51:55.800: E/ImageLoader(31605): at libcore.io.Streams.readAsciiLine(Streams.java:203)
03-21 13:51:55.800: E/ImageLoader(31605): at libcore.net.http.HttpEngine.readResponseHeaders(HttpEngine.java:544)
03-21 13:51:55.800: E/ImageLoader(31605): at libcore.net.http.HttpEngine.readResponse(HttpEngine.java:784)
03-21 13:51:55.800: E/ImageLoader(31605): at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:274)
03-21 13:51:55.800: E/ImageLoader(31605): at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:479)
03-21 13:51:55.800: E/ImageLoader(31605): at com.nostra13.universalimageloader.core.download.BaseImageDownloader.getStreamFromNetwork(BaseImageDownloader.java:113)
03-21 13:51:55.800: E/ImageLoader(31605): at com.nostra13.universalimageloader.core.download.BaseImageDownloader.getStream(BaseImageDownloader.java:84)
03-21 13:51:55.800: E/ImageLoader(31605): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.saveImageOnDisc(LoadAndDisplayImageTask.java:299)
03-21 13:51:55.800: E/ImageLoader(31605): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryLoadBitmap(LoadAndDisplayImageTask.java:237)
03-21 13:51:55.800: E/ImageLoader(31605): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.run(LoadAndDisplayImageTask.java:149)
03-21 13:51:55.800: E/ImageLoader(31605): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
03-21 13:51:55.800: E/ImageLoader(31605): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
03-21 13:51:55.800: E/ImageLoader(31605): at java.lang.Thread.run(Thread.java:856)
使用时应使用视图架性能。
http://developer.android.com/training/improving-layouts/smooth-scrolling.html
您的代码可能的ListView的滚动,这会降低性能时经常致电findViewById()。即使适配器返回回收的充气视图,您仍然需要查找元素并进行更新。围绕重复使用findViewById()的方法是使用“视图持有者”设计模式。
http://www.youtube.com/watch?v=wDBM6wVEO70。该主题是abot listview和查看持有者。
SokectTimeOut套接字读取或接受操作超时到期时引发异常。
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(a.getApplicationContext())
.enableLogging()
.build();
.imageDownloader(new URLConnectionImageDownloader(5 * 1000, 20 * 1000)) // connectTimeout (5 s), readTimeout (20 s)
对于EOFException检查链接。
http://code.google.com/p/libs-for-android/issues/detail?id=14。
System.setProperty("http.keepAlive", "false").
问题类似被提出,有人建议在打开HTTP URL连接之前尝试上面的内容。
可能与您的代码无关。
首先感谢您的帮助和时间。我的ListView没有更多的12个元素,所以我猜findViewById在这里没有任何问题。但是,谢谢你的提示!至于SocketTimeOut异常你是对的,改变超时摆脱它。最后一个是EOF异常,它只在有时候抛出。任何想法为什么? – Datenshi 2013-03-21 11:58:01
看起来像它与图像下载有关。 – Raghunandan 2013-03-21 12:02:06
好的,在接受答案之前我会稍微等一下,也许其他人会知道为什么有时会发生这种故障。再次感谢您的帮助 – Datenshi 2013-03-21 12:09:55
选项=新DisplayImageOptions.Builder() .cacheOnDisc() .imageScaleType(ImageScaleType.EXACTLY) .bitmapConfig(Bitmap.Config.RGB_565) .build();试试这个 – Raghunandan 2013-03-21 09:40:29
你在内存缓存或盘??。你可以发布一些相关的代码吗? – Raghunandan 2013-03-21 09:41:49
我的构建完全像你写的。 – Datenshi 2013-03-21 10:12:07