在Android上从服务器加载大图像

前端之家收集整理的这篇文章主要介绍了在Android上从服务器加载大图像前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图将服务器中的jpg文件显示为imageView.当我尝试加载较小的图像(300×400)时,没有问题.但是当我尝试加载全尺寸图片(2336×3504)时,图像将无法加载.图像的文件大小仅为2mb.我没有在logcat中得到任何错误,也没有抛出异常.它根本不会加载图像.我也试过用这个:
  1. BitmapFactory.Options options=new BitmapFactory.Options();
  2. options.inSampleSize = 8;
  3. Bitmap preview_bitmap=BitmapFactory.decodeStream(is,null,options);

这对于加载大文件没有任何帮助,但它确实调整了较小的图像(就像它假设的那样).我确实将大图添加到我的资源并测试它,就像它嵌入在应用程序中一样,它工作正常,只是无法在服务器上工作.我一整天都在工作,似乎无法弄清楚如何加载这些大图片.任何人都可以帮我解决这个问题吗?谢谢你的任何信息.

Here是我找到上述代码链接,并且一直在玩其他示例,但仍然没有让它工作.

编辑:

这是我正在使用的代码,用于加载图像:

  1. public static Bitmap getBitmapFromURL(String src) {
  2. Bitmap bmImg;
  3. URL myFileUrl = null;
  4.  
  5. try {
  6. myFileUrl = new URL(src);
  7.  
  8. HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection();
  9. conn.setDoInput(true);
  10. conn.connect();
  11. InputStream is = conn.getInputStream();
  12.  
  13. BitmapFactory.Options options=new BitmapFactory.Options();
  14. options.inSampleSize = 16;
  15.  
  16. bmImg = BitmapFactory.decodeStream(is,options);
  17. return bmImg;
  18. } catch (Exception e) {
  19. // TODO Auto-generated catch block
  20. Log.d("Error",e.toString());
  21. return null;
  22. }
  23. }

这是logcat截图(无法弄清楚如何在eclipse中正确复制文本)我在点击按钮加载图像之前清除了日志.所以你看到的就是当我点击那个按钮时会发生什么.我删除了公司和应用程序名称(你看到“com.”,假设它的“com.mycompany.myapp”.

解决方法

BitmapFactory.decodeFromStream()放弃并在将其直接连接到远程连接的InputStream时返回null并不罕见.在内部,如果你没有为方法提供BufferedInputStream,它会将提供的流包装在一个缓冲区大小为16384的流中.有时可行的一个选项是传递缓冲区大小更大的BufferedInputStream:
  1. BufferedInputStream bis = new BufferedInputStream(is,32 * 1024);

一种更普遍有效的方法是首先完全下载文件,然后解码数据,如下所示:

  1. InputStream is = connection.getInputStream();
  2. BufferedInputStream bis = new BufferedInputStream(is,8190);
  3.  
  4. ByteArrayBuffer baf = new ByteArrayBuffer(50);
  5. int current = 0;
  6. while ((current = bis.read()) != -1) {
  7. baf.append((byte)current);
  8. }
  9. byte[] imageData = baf.toByteArray();
  10. BitmapFactory.decodeByteArray(imageData,imageData.length);

仅供参考,本例中的缓冲区大小有些随意.正如在其他答案中所说的那样,不要将图像在内存中保留的时间长于你所需要的,这是一个奇妙的想法.您可以考虑将其直接写入文件显示缩减采样版本.

希望有所帮助!

猜你在找的Android相关文章