打开一个文件夹,里面的内容在原来的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更新布局就悲剧了,连续几十次,慢得要死,谁知道怎么回事不?有没有解决的办法哦

解决方案 »

  1.   

    请问下你是如何更新的,你可以调用Adapter的notifyDataSetChanged来刷新页面
    另外考虑到你打开会很慢,是因为你的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都会重新加载元素,知道元素全部加载完成
      

  2.   

    这个项目不是我写,我也是改一下而已,GridView是调用Adapter的notifyDataSetChanged来刷新界面的,但他没有像你这样写,好像是每次只能加载8张,adapter.count一直没变,所以拖动画面的时候总是很卡.这个方法不错啊,学习了。
    不过内存的问题还是没解决,不知道是不是虚拟机内存设置问题,这方面我不怎么懂。安卓系统给jvm分配的内存是由系统设置的还是由程序设置的啊,我写代码的时候eclipse老是卡,所以怀疑是不是我设置了虚拟内存参数有关,反正是照着别人写的胡乱设置的,自己都是糊涂的。我这个平板512M内存,但运行这么一个安卓程序竟然这么卡,怀疑是不是虚拟内存分配太大了,系统没有什么内存可用才会一直释放内存,所以这样?
      

  3.   

    davilk vm对图像的内存,限制在8M,就是说当前处理图片的内存大小不能超过8M,如果你GridView包含图片,而你的原图又非常大,那么你可以先这样: public View getView(final int position, View convertView,
    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,那么就可以省去新建控件对象和初始化这些对象,可以带来效率的很大提升,你看看你是不是像上面这样做了缓存处理
      

  4.   

    Quote=引用 4 楼 ncuboy045wsq 的回复:]
    引用 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);
    }
    }
    [
      

  5.   


    这样做好像不行啊,如果这样的话就不知道totalItemCount是多少了,总不能每次滚动都让adapter.count一直这样加下去吧
      

  6.   


    这样做好像不行啊,如果这样的话就不知道totalItemCount是多少了,总不能每次滚动都让adapter.count一直这样加下去吧