2011-08-19 53 views
1

我有一个Android图库小部件,它可以显示来自网络的图片的几个ImageViews。图像以jpgs存储,并在添加到ImageViews之前转换为位图。每个jpg都是8kb。我没有对图像进行任何缩放。Android:Gallery Widget性能糟糕,有什么原因?

当我使用带有1或2张图片的图库时,它可以正常工作,滚动是平滑的等等。随着3,它开始变得有点波涛汹涌,并且在5或10张图片中,应用程序几乎不可用。

有没有人有任何想法,为什么表现如此糟糕?有没有人有替代方案的建议?谢谢你 -

@elevine:我的方法来构建从JPG网址位:

private Bitmap getBitmapFromURL(String input) throws IOException { 
     URL url = new URL(input); 
     URLConnection conn = url.openConnection(); 
     conn.connect(); 
     InputStream is = conn.getInputStream(); 
     BufferedInputStream bis = new BufferedInputStream(is); 
     Bitmap bm = BitmapFactory.decodeStream(bis); 
     bis.close(); 
     is.close(); 
     return bm; 
    } 

这是从我的ImageAdapter我getView方法。我开始怀疑这是我问题所在的地方......我是否多次抓取图像?谢谢你的帮助!

public View getView(int position, View convertView, ViewGroup parent) { 
      ImageView imageView = new ImageView(mContext); 

      Bitmap bm; 
      try { 
       imageView.setImageBitmap(getBitmapFromURL(urls.get(position))); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      //mageView. 
      imageView.setScaleType(ImageView.ScaleType.FIT_CENTER); 
      imageView.setLayoutParams(new Gallery.LayoutParams(100,100)); 
      return imageView; 
     } 
+0

你是如何载入“网络图片”的? – elevine

+0

这看起来很乱,在原来的问题中发布代码: – deakolt

+0

你可以显示你在哪里调用getBitmapFromURL吗? – elevine

回答

1

如果您从您的Activity中调用getBitmapFromURL,那么它可能会阻塞UI线程。确保此代码在单独的线程上或在AsyncTask中运行。您也可能想要将Bitmap缓存在WeakHashmap中。在从网络抓取缓存之前检查缓存中的图像。

+0

谢谢!我认为这是问题。我将下载并缓存后台线程中的所有图像,然后在getView()中简单地从缓存中获取图像。 – deakolt

+0

是。工作喜欢魅力,再次感谢。 – deakolt

1

下面是一些提示itthat可能出现派上用场:

  • 首先尝试缓存与内存的WeakReference形象,也对磁盘(如果可能),因此您不必在下载浪费资源流动图像重新一遍。
  • 如果您重写GalleryAdapter并且您没有帮助适配器回收您的视图,性能可能会很差列出项目
  • 也尝试在不同的线程上执行下载操作,请考虑使用AsyncTask。

这里有一个有趣ImageManager您可能需要使用其他

+0

我认为你是现货;我认为我正在重新下载图片方式,并且使用UI线程来做 - 我要试着缓存图片。 – deakolt

+0

你的答案基本上是正确的,我很抱歉,我无法赞成或标记为正确的(其他人先帮助我),但谢谢你! – deakolt

+0

10-4,保持干净!(你的代码) – Necronet

1

一个项目需要考虑的是animationDuration。您可以将其设置为0,这将有助于滚动性能。我最近需要使用正在处理的Google TV应用来完成此操作,否则会暂停一两次。还建议预先缓存图像,并尽可能减少一次显示的图像数量。

相关问题