2013-03-21 76 views
1

我有通用圖像加載器的另一個問題。試圖在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) 
+0

選項=新DisplayImageOptions.Builder() .cacheOnDisc() .imageScaleType(ImageScaleType.EXACTLY) .bitmapConfig(Bitmap.Config.RGB_565) .build();試試這個 – Raghunandan 2013-03-21 09:40:29

+0

你在內存緩存或盤??。你可以發佈一些相關的代碼嗎? – Raghunandan 2013-03-21 09:41:49

+0

我的構建完全像你寫的。 – Datenshi 2013-03-21 10:12:07

回答

2

使用時應使用視圖架性能。

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連接之前嘗試上面的內容。

可能與您的代碼無關。

+0

首先感謝您的幫助和時間。我的ListView沒有更多的12個元素,所以我猜findViewById在這裏沒有任何問題。但是,謝謝你的提示!至於SocketTimeOut異常你是對的,改變超時擺脫它。最後一個是EOF異常,它只在有時候拋出。任何想法爲什麼? – Datenshi 2013-03-21 11:58:01

+0

看起來像它與圖像下載有關。 – Raghunandan 2013-03-21 12:02:06

+0

好的,在接受答案之前我會稍微等一下,也許其他人會知道爲什麼有時會發生這種故障。再次感謝您的幫助 – Datenshi 2013-03-21 12:09:55