2010-03-19 81 views
1

我在我的项目中使用缩略图加载器,下面提到了一个。问题是它会正确加载所有缩略图,除了大小约为40K的缩略图外。当我们的后端给出那种缩略图不会生成,有时这最终也会导致崩溃。Android缩略图加载问题

我该怎么处理这件事?

public class ThumbnailManager 
{ 

private final Map<String, Bitmap> drawableMap; 
public static Context context; 
private Resources res; 
private int thumbnail_size; 

public ThumbnailManager() 
{ 
    drawableMap = new HashMap<String, Bitmap >(); 
    res = new Resources(context.getAssets(), null, null); 
    thumbnail_size = res.getInteger(R.ThumbnailManager.THUMBNAIL_SIZE); 
} 

public Bitmap fetchBitmap(String urlString) 
{ 
    if(drawableMap.containsKey(urlString)) 
    { 
     return (drawableMap.get(urlString)); 
    } 

    //Log.d(getClass().getSimpleName(), " Image URL :: "+ urlString); 
    try 
    { 
     InputStream is = fetch(urlString); 
     android.util.Log.v("ThumbnailManager", "ThumbnailManager " + urlString); 
     drawableMap.put(urlString, BitmapFactory.decodeStream(is));//Bitmap.createScaledBitmap(BitmapFactory.decodeStream(is), thumbnail_size, thumbnail_size, false)); 
     return drawableMap.get(urlString); 
    } 
    catch(Exception e) 
    { 
     android.util.Log.v("EXCEPTION", "EXCEPTION" + urlString); 
     return null; 
    } 
} 

public void fetchBitmapOnThread(final String urlString, final ImageView imageView) 
{ 
    if(drawableMap.containsKey(urlString)) 
    { 
     imageView.setImageBitmap(drawableMap.get(urlString)); 
     return; 
    } 

    if(urlString.compareTo("AUDIO") == 0) 
    { 
     Bitmap audioThumb = BitmapFactory.decodeResource(context.getResources(), R.drawable.timeline_audio_thumb); 
     drawableMap.put(urlString, Bitmap.createScaledBitmap(audioThumb, thumbnail_size, thumbnail_size, false)); 
     imageView.setImageBitmap(drawableMap.get(urlString)); 
     return; 
    } 

    final Handler handler = new Handler() 
    { 
     public void handleMessage(Message message) 
     { 
      imageView.setImageBitmap((Bitmap) message.obj); 
     } 
    }; 

    Thread thread = new Thread() 
    { 
     public void run() 
     { 
      Bitmap urlBitmap = fetchBitmap(urlString); 
      Message message = handler.obtainMessage(1, urlBitmap); 
      handler.sendMessage(message); 
     } 
    }; 
    thread.start(); 
} 

public InputStream fetch(String urlString) throws IOException, MalformedURLException 
{ 
    final URL url = new URL(urlString); 
    final URLConnection conn = url.openConnection(); 
    HttpURLConnection httpConn = (HttpURLConnection) conn; 
    httpConn.setAllowUserInteraction(true); 
    httpConn.setInstanceFollowRedirects(true); 
    httpConn.setRequestMethod("GET"); 
    httpConn.connect(); 

    return(conn.getInputStream()); 
} 
} 
+1

在Eclipse中使用'adb logcat',DDMS或DDMS透视图来检查与您的“崩溃”相关的堆栈跟踪,因为这会告诉您哪里出了问题。 – CommonsWare

+0

这是一个内存不足的例外,但我的问题是没有得到加载的40K缩略图...你能告诉我代码中的问题。 –

回答

1

如果您在此处添加堆栈跟踪,那将会很棒。但我怀疑它也是一个记忆问题。如果您将大量位图加载到内存中,则它们需要比原始文件大小更多的内存。防爆。您的40k的缩略图可能是400k的位图,这取决于分辨率。使用ddms并观察您的应用有多少空闲内存。如果它的工作内存小于2MB,则BitmapFactory在解码大拇指时可能会产生RuntimeException。