0

我有一个 GridView 填充了 50-100 个图像,图像从它们的 url 开始异步加载。我使用如下所示的 ArrayAdapter,它设置一个占位符图像,然后运行一个线程来加载图像。

该代码工作正常,但它非常slooooow,所以我会理解WebView 怎么这么快?

一个 WebView 可以在几秒钟内加载一个包含十几个图像的 HTML 页面。如果我用我的图片 url(只有img标签)创建一个 HTML 页面,它会在几毫秒内加载。

我必须如何编写代码才能获得类似于 WebView 组件的性能?

只是为了完整性缓存图像在我的情况下是无关紧要的

优化线程创建(生成 100 个线程不是最佳实践)并不能解决问题,但显然时间减少了几秒钟。

public class ImageAdapter extends ArrayAdapter<ImageInfo> {
    private static final String POSITION = "position";
    private static final String URL = "url";
    private static final String BITMAP = "bitmap";

    SparseArray<ImageView> views = new SparseArray<ImageView>();

    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView;
        if (convertView == null) {
            imageView = new ImageView(getContext());
            imageView.setLayoutParams(new GridView.LayoutParams(75, 75));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setPadding(0, 0, 0, 0);
        } else {
            imageView = (ImageView) convertView;
        }
        imageView.setImageResource(android.R.drawable.ic_menu_gallery);

        Bundle b = new Bundle();
        b.putString(URL, getItem(position).thumbnailURL);
        b.putInt(POSITION, position);
        new LoadImage().execute(b);

        views.put(position, imageView);
        return imageView;
    }

    private class LoadImage extends AsyncTask<Bundle, Void, Bundle> {
        protected Bundle doInBackground(Bundle... b) {
            String url = b[0].getString(URL);

            try {
                b[0].putParcelable(BITMAP, ImageUtils.readImage(url));
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return b[0];
        }

        protected void onPostExecute(Bundle result) {
            ImageView view = views.get(result.getInt(POSITION));

            view.setImageBitmap((Bitmap) result.getParcelable(BITMAP));
        }
    }
}

ImageInfo 类

public class ImageInfo {
        public String thumbnailURL;
        public String imageURL;
}
4

2 回答 2

0

由于您的应用程序可能有大量的 GPU Overdraw,它可能会很慢。如果您有模拟器或运行 Jellybean 的设备,请进入开发人员设置并检查 GPU Overdraw,然后重新打开您的应用程序。如果它大部分是红色的,你的问题可能就在那里,尤其是你的网格视图有很多部分。如果它大部分是红色的,我建议阅读此内容并解决您的过度绘制问题:Romain Guy 的优化指南。

于 2013-07-27T17:41:32.697 回答
0

找到了问题和解决方案,AsyncTask 序列化所有操作,我用AsyncTask.executeOnExecutor 替换了AsyncTask.execute,现在应用程序真的很快,只需几秒钟即可下载 50-70 张图像并在 GridView 中显示它们。

于 2013-07-28T07:33:24.953 回答