我有一个填充了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;
}
答案 0 :(得分:0)
由于您的应用可能拥有大量的GPU Overdraw,因此可能会很慢。如果您有运行Jellybean的模拟器或设备,请进入开发人员设置并检查GPU Overdraw,然后重新打开您的应用程序。如果它主要是红色的,那么你的问题可能存在,特别是你的gridview有很多部分。如果它主要是红色,我建议您阅读此内容并修复透支问题:Romain Guy's Optimisation guide.
答案 1 :(得分:0)
发现问题和解决方案,AsyncTask序列化所有操作,我用AsyncTask.executeOnExecutor替换了AsyncTask.execute,现在应用程序真的很快下载50-70个图像并在GridView中显示它们几秒钟