android - UIL 加载精确图像

标签 android universal-image-loader

我还有另一个关于通用图像加载器的问题。尝试在 ListView 和 GridView 中使用它来显示大量图像。传递给 UIL 的 url 包含高分辨率图像。我已经尝试使用几乎所有的 scaletypes,它在移动网络上加载图像的速度仍然比原始 LazyList 慢得多。据我了解,它首先加载确切的图像,然后调整它的大小。有没有办法下载更少量的数据来显示这个非常缩放的图像。此外,它有时会在加载具有两个不同异常的图像时崩溃。 EOFException 和 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) {
                
            }
    });
    }
}

更新 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)

最佳答案

使用时应使用 View 持有者以提高性能。

http://developer.android.com/training/improving-layouts/smooth-scrolling.html

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

http://www.youtube.com/watch?v=wDBM6wVEO70 .主题是关于 ListView 和 View 持有者。

当套接字读取或接受操作超时时,将抛出 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 连接之前尝试上述方法。

可能与您的代码无关。

关于android - UIL 加载精确图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15543811/

相关文章:

android - 在 Android 上使用 SD 卡进行低级操作

android - Jetpack AndroidX 测试 "Write Once, Run Everywhere"- 但运行 Everywhere 的最佳方式是什么?

android - stub_image 显示在 recyclerview 中的通用图像加载器上

java - 通用图像加载器 imageview 不会使用微调器自行更新

android - 在 ImageView 中加载多个图像

android - FCM 如何知道谁将接收上游消息?

java - 如何在android中验证警报对话框中的文本框

android - 如何在android中检查当前的互联网连接是否可用

android - System.out resolveUri 在错误的位图 uri : https://. 上失败 .. 当我尝试将图片从 Web 插入到 ListView 时

android - Picasso v/s Imageloader v/s Fresco vs Glide vs Coil