打开一个文件夹,里面的内容在原来的GridView更新后显示,但是每次打开都要等很久,差不多要5~10秒,我郁闷了,看Logcat是这样的记录,连续几十条:
12-08 07:14:40.990: D/dalvikvm(1410): GC_FOR_MALLOC freed 9765 objects / 556648 bytes in 44ms
好像是垃圾回收的记录。
郁闷死我了,好像从一个activity到另一个activity更新界面很快,不会没有做几次垃圾回收,但在同一个activity更新布局就悲剧了,连续几十次,慢得要死,谁知道怎么回事不?有没有解决的办法哦
12-08 07:14:40.990: D/dalvikvm(1410): GC_FOR_MALLOC freed 9765 objects / 556648 bytes in 44ms
好像是垃圾回收的记录。
郁闷死我了,好像从一个activity到另一个activity更新界面很快,不会没有做几次垃圾回收,但在同一个activity更新布局就悲剧了,连续几十次,慢得要死,谁知道怎么回事不?有没有解决的办法哦
另外考虑到你打开会很慢,是因为你的GridView要显示的数量过多,你可以先显示8张左右,然后每次滚动都缓冲显示,知道全部显示完成。
首先你让GridView实现onScrollListener接口,在实现的接口方法中这样做:
public void onScroll(AbsListView v, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
lastItem = firstVisibleItem + visibleItemCount - 1;
if (adapter.count == lastItem) {
adapter.count += 10;
adapter.notifyDataSetChanged();
} }
就如上面说adapter.count默认初始值可以设成8,这样的好处就是你不需要一开始就显示全部的元素,这样带来的好处可以缩短用户的等待时间,提高体验效果。实现的方法带来的效果是每次你滚动到可视元素的末尾GridView都会重新加载元素,知道元素全部加载完成
不过内存的问题还是没解决,不知道是不是虚拟机内存设置问题,这方面我不怎么懂。安卓系统给jvm分配的内存是由系统设置的还是由程序设置的啊,我写代码的时候eclipse老是卡,所以怀疑是不是我设置了虚拟内存参数有关,反正是照着别人写的胡乱设置的,自己都是糊涂的。我这个平板512M内存,但运行这么一个安卓程序竟然这么卡,怀疑是不是虚拟内存分配太大了,系统没有什么内存可用才会一直释放内存,所以这样?
ViewGroup parent) {
ViewHolder holder = null;
// TODO Auto-generated method stub
if (convertView == null) {// 如果不进行删除操作,则不需要重新加载控件
convertView = mLayoutInflater.inflate(R.layout.x_grid_view,
null);
holder = new ViewHolder();
holder.mLinear = (LinearLayout) convertView
.findViewById(R.id.xgridview_linear);
holder.mImageView = (ImageView) convertView
.findViewById(R.id.xgridview_imageview);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
if (holder != null) {// 给指定的view设置id,这样就不需要重新加载控件
// 当然是相对于控件不变或者减少,(如果控件增加,则不适合)
convertView.setId(position);// 使convertView与holder同步
holder.setId(position);
//这里使用Holder.成员名代码layout布局中的控件
}}
上面的好处在于你可以每次刷新的时候,convertView都不为Null,那么就可以省去新建控件对象和初始化这些对象,可以带来效率的很大提升,你看看你是不是像上面这样做了缓存处理
引用 3 楼 bobierbo 的回复:
这个项目不是我写,我也是改一下而已,GridView是调用Adapter的notifyDataSetChanged来刷新界面的,但他没有像你这样写,好像是每次只能加载8张,adapter.count一直没变,所以拖动画面的时候总是很卡.这个方法不错啊,学习了。
不过内存的问题还是没解决,不知道是不是虚拟机内存设置问题,这方面我不怎么懂。安卓系统……
[/Quote]
补充一下上面因为网速问题缺失的处理图片代码: public Bitmap decode(String filepath) {
if(!new File(filepath).exists()){
return null;
}
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filepath,opt);
int out_width = opt.outWidth;
int out_height = opt.outHeight;
if((Math.max(out_width, out_height)<Math.max(mWidth, mHeight))){
opt=null;
return null;
}
int memory = 4 * out_width * out_height;
opt.inJustDecodeBounds = false;
if (memory >= MAX_SIZE) {
opt.inSampleSize = 3;
return BitmapFactory.decodeFile(filepath, opt);
}
else{
return BitmapFactory.decodeFile(filepath,opt);
}
}
[
这样做好像不行啊,如果这样的话就不知道totalItemCount是多少了,总不能每次滚动都让adapter.count一直这样加下去吧
这样做好像不行啊,如果这样的话就不知道totalItemCount是多少了,总不能每次滚动都让adapter.count一直这样加下去吧