Android UIL加载精确图像

Android UIL加载精确图像,android,universal-image-loader,Android,Universal Image Loader,我有另一个问题与通用图像加载器。尝试在listview和gridview中使用它来显示大量图像。传递给UIL的URL包含高分辨率图像。我尝试过使用几乎所有的ScaleType,但它在移动网络上加载图像的速度仍然比原来的LazyList慢得多。据我所知,它首先加载准确的图像,然后调整大小。有没有一种方法可以下载少量的数据来显示这个比例非常大的图像。此外,它有时会在加载图像时出现崩溃,但有两个不同的例外。EOFEException和SocketTimeoutException。你知道我做错了什么吗

我有另一个问题与通用图像加载器。尝试在listview和gridview中使用它来显示大量图像。传递给UIL的URL包含高分辨率图像。我尝试过使用几乎所有的ScaleType,但它在移动网络上加载图像的速度仍然比原来的LazyList慢得多。据我所知,它首先加载准确的图像,然后调整大小。有没有一种方法可以下载少量的数据来显示这个比例非常大的图像。此外,它有时会在加载图像时出现崩溃,但有两个不同的例外。EOFEException和SocketTimeoutException。你知道我做错了什么吗

更新: 适配器类:

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) {
                
            }
    });
    }
}

使用时应使用视图保持架进行性能测试

在滚动ListView期间,您的代码可能会频繁调用findViewById(),这会降低性能。即使适配器返回一个膨胀视图进行循环,您仍然需要查找元素并更新它们。避免重复使用findViewById()的一种方法是使用“视图持有者”设计模式

。主题是一个列表视图和视图持有者

SokectTimeOut异常在套接字读取或接受操作的超时过期时引发

    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(a.getApplicationContext())
    .enableLogging()
    .build();
    .imageDownloader(new URLConnectionImageDownloader(5 * 1000, 20 * 1000)) // connectTimeout (5 s), readTimeout (20 s)
对于EOFEException,请检查链接

提出了类似的问题,一些人建议在打开HTTP url连接之前尝试上述方法


可能与您的代码无关。

options=new DisplayImageOptions.Builder().cacheOnDisc().imageScaleType(imageScaleType.justice).bitmapConfig(Bitmap.Config.rgb565).build();。试试看,你是在内存中缓存还是在光盘中缓存??。你能发布一些相关的代码吗?我的版本和你写的一模一样。发布一些相关的代码。比如哪个部分?使用慢速移动互联网时会出现问题。在wifi上它可以正常工作首先感谢您的帮助和时间。我的ListView不超过12个元素,所以我想findViewById在这里没有任何问题。但是谢谢你的提示!至于SocketTimeOut异常,您是对的,更改超时可以消除它。最后一个是EOF异常,它只在某些时候抛出。。知道为什么吗?看起来这和图像下载有关。好吧,我会等一会儿再接受答案,也许其他人会知道为什么有时会发生这种崩溃。再次感谢您的帮助检查答案中的最后一个链接。您能解释一下获取URL吗?我不是以英语为母语的人,所以。。所以基本上,从你给出的链接中,我可以说这是我的4.0.4安卓bug,而不是我应用程序中的任何东西。
    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(a.getApplicationContext())
    .enableLogging()
    .build();
    .imageDownloader(new URLConnectionImageDownloader(5 * 1000, 20 * 1000)) // connectTimeout (5 s), readTimeout (20 s)
  System.setProperty("http.keepAlive", "false").