我有一个 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;
}