【问题标题】:Android: Gallery Widget performance is terrible, any reasons?Android:Gallery Widget 性能很糟糕,有什么原因吗?
【发布时间】:2013-01-15 01:17:18
【问题描述】:

我有一个 Android Gallery 小部件,它显示了几个带有来自网络的图片的 ImageView。图像存储为 jpg,并在添加到 ImageView 之前转换为位图。每个 jpg 为 8kb。我没有对图像进行任何缩放。

当我使用包含 1 或 2 张图片的图库时,它运行良好,滚动流畅等。使用 3 张时,它开始变得有点不稳定,而在 5 或 10 张图片时,应用程序几乎无法使用。

有没有人知道为什么性能如此糟糕?有人对替代品有建议吗?谢谢-

@elevine:我从 jpg url 构造位图的方法:

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;
        }

【问题讨论】:

  • “图片来自网络”的加载情况如何?
  • 这看起来很乱,在原始问题中发布代码:
  • 你能说明你在哪里调用 getBitmapFromURL 吗?
  • 只是一个一般性建议:如果可能,测量它变慢的地方,这通常比猜测和尝试更快。这是一个很好的使用 traceview 的教程:android-developers.blogspot.com/2010/10/…
  • 谢谢alextsc!我一直在寻找类似的工具!

标签: android android-gallery


【解决方案1】:

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

【讨论】:

  • 谢谢!我认为这是问题所在。我将在后台线程上下载并缓存所有图像,然后在 getView() 中简单地从缓存中获取图像。
【解决方案2】:

这里有一些可能会派上用场的提示:

  • 尝试先使用 Wea​​kReference 将图像缓存到内存中,然后再缓存到磁盘上(如果可能的话),这样您就不必浪费移动资源重新下载图像了。
  • 如果您覆盖 GalleryAdapter 并且您没有帮助适配器回收您的视图列表项,则性能可能会很差
  • 另外尝试在不同的线程上执行下载操作,考虑使用 AsyncTask。

这是一个有趣的ImageManager,你可能会用到

【讨论】:

  • 我认为你是正确的;我想我重新下载图像的次数太多了,并且使用 UI 线程来执行此操作 - 我将尝试缓存图像。
  • 您的回答基本正确,很抱歉我无法投票或标记为正确(其他人先帮助我),但谢谢!
【解决方案3】:

另一个需要考虑的项目是animationDuration。您可以将其设置为 0,这将有助于提高滚动性能。我最近需要使用我正在开发的 Google TV 应用程序来执行此操作,否则会有一两秒钟的停顿。还建议预先缓存您的图像,并尽可能减少一次显示的图像数量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    相关资源
    最近更新 更多