【发布时间】:2012-04-25 08:38:09
【问题描述】:
首先,我已经做了一些事情来在gridview中显示图像以使滚动时平滑
1.在后台线程上从互联网加载图像
AsyncTask acyncTask ;
HandlerThread handlerThread ;
URL imageUrl = new URL(link);<br>
HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection();
conn.setConnectTimeout(30000);
conn.setReadTimeout(30000);
conn.setInstanceFollowRedirects(true);
InputStream is=conn.getInputStream();
final Bitmap bitmap = BitmapFactory.decodeStream(is);
2。将位图制作成样本大小以节省内存
final BitmapFactory.Options option = new BitmapFactory.Options();
option.inJustDecodeBounds = true;
BitmapFactory.decodeFile(mFile.getPath(),
option);
option.inSampleSize = calculateInSampleSize(option , mSize , mSize);
option.inJustDecodeBounds = false;
option.inPurgeable = true ;
option.inDither = false ;
option.inScaled = false ;
option.inPreferredConfig = Bitmap.Config.ARGB_8888;
3.制作缓存以保存解码的位图
LruCache lruCache = new LruCache<String , Bitmap>();
在baseadapter getView();
我会lruCache.get(key)拿解码的位图
4.通过处理程序解码位图时的延迟加载
Handler handler = new Handler();
handler.post(new Runnable(){
public void run(){
imageView.setimageBitmap(bitmap);
}
});
现在我面临一个大问题,当我滚动时它仍然有点滞后 我有谷歌关于可以使 滚动更好 的东西,不知道真的可以改进或问题出在我检查每个 getView() 的地方只花了我大约 2 ~6ms,它会调用我的代码来异步加载图像表单工作线程,所以我真的不知道为什么有些应用可以加载非常流畅?我的情况是滚动时屏幕看起来不太流畅,是否可以应用一些建议?
已编辑:当我滚动时,在缓存中找到的位图并显示在屏幕上,如果我快速滚动,它看起来就像没有足够的滚动来显示图像,它会使我的滚动不那么流畅,即使我有在缓存中缓存位图
这是适配器代码:
if (convertView == null) {
convertView = layoutInflater.inflate(
R.layout.row_display_image_grid, null);
viewHolder = new DisplayImageGridViewHolder();
viewHolder.background = (RelativeLayout) convertView
.findViewById(R.id.background);
viewHolder.image = (ImageView) convertView.findViewById(R.id.image);
viewHolder.text = (TextView) convertView.findViewById(R.id.text);
viewHolder.position = position;
viewHolder.text.setEllipsize(TruncateAt.END);
viewHolder.text.setTypeface(typeFace);
viewHolder.image.setOnClickListener(this);
viewHolder.image.setOnLongClickListener(this);
convertView.setTag(viewHolder);
} else {
viewHolder = (DisplayImageGridViewHolder) convertView.getTag();
}
viewHolder.position = position;
imageLoader.loadImage(imageLinkList.get(position), viewHolder.image);
return convertView;
【问题讨论】:
-
您能否发布您的适配器代码,特别是 getView() 方法。这很可能是滚动延迟的来源。
-
已经添加了,我只是在工作线程中调用了一个方法来启动加载任务,我在这个getview方法之前和之后检查过,它只花了我几秒钟,你认为setimagebitmap是什么东西滚动gridview时出现问题
-
你的代码还是有点不清楚。你能发布你的整个 ImageLoader 类吗?我正在使用非常相似的代码,可能基于相同的示例,并且没有延迟。
-
哦,我明白了,您使用的是类似的,您如何在 gridview 上显示图像?如果你快速滚动,会不会有点滞后?我只是将显示位图方法从 runonuithread 更改为处理程序 postdelayed ,否则相同。
-
我只是使用 AsyncTasks 来加载图像。从 doInBackground 中的网络/本地存储/内存加载图像。然后在 onPostExecute 中设置图片。
标签: android performance bitmap