如何在将图像读入GridView时获得WebView性能

时间:2013-07-27 17:23:16

标签: android performance webview

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

代码运行正常,但它非常慢,所以我会理解WebView是如此之快?

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

如何编写代码以使其具有与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;
}

2 个答案:

答案 0 :(得分:0)

由于您的应用可能拥有大量的GPU Overdraw,因此可能会很慢。如果您有运行Jellybean的模拟器或设备,请进入开发人员设置并检查GPU Overdraw,然后重新打开您的应用程序。如果它主要是红色的,那么你的问题可能存在,特别是你的gridview有很多部分。如果它主要是红色,我建议您阅读此内容并修复透支问题:Romain Guy's Optimisation guide.

答案 1 :(得分:0)

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