欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

Android加载数据ListView优化内存实现,androidlistview,问题分析 在移动端项目

来源: javaer 分享于  点击 2841 次 点评:132

Android加载数据ListView优化内存实现,androidlistview,问题分析 在移动端项目


问题分析 在移动端项目开发中,基于加载大数据量的原因,经常出现内存溢出的现象,那么减少内存占用,在真实开发中着实很重要,下面介绍下ListView加载数据量大时解决思路:

我们应该碰到过这样的情况,对于加载的listview,我们慢慢滑动数据时,系统加载数据没有问题,但是当加快滑动数据时,就会出现内存溢出的问 题(这里不考虑分页加载方法)。总结这是因为手机屏幕显示的原因,每次加载数据是有限的,慢慢滑动数据,在加载数据的同时,系统能有时间回收不用的内存, 才不会暴露问题,但是,加快滑动,内存回收GC来不及,慢慢内存就满了。知道了原因,加大内存,减慢滑动速度显然不是好的方案,实现内存重复使用才是最重 要的。 解决方案 我们知道,数据最后显示在手机屏幕,是通过Adapter适配器来实现的,在其默认实现方法getView()方法中,我们实现如下代码:

    //有多少个条目被显示,这个方法就会被调用多少次      @Override      public View getView(final int position, View convertView, ViewGroup parent) {          View view;          ViewHolder holder;          //1.减少内存中view对象创建的个数(优化listView,避免内存溢出)          if(convertView==null){              Log.i(TAG,"创建新的view对象:"+position);              //把一个布局文件转化成  view对象。              view  = View.inflate(getApplicationContext(), R.layout.list_item_callsms, null);              //2.减少子孩子查询的次数  内存中对象的地址。              holder = new ViewHolder();              holder.tv_number = (TextView) view.findViewById(R.id.tv_black_number);              holder.tv_mode = (TextView) view.findViewById(R.id.tv_block_mode);              holder.iv_delete = (ImageView) view.findViewById(R.id.iv_delete);              //当孩子生出来的时候找到他们的引用,存放在记事本,放在父亲的口袋              view.setTag(holder);          }else{              Log.i(TAG,"厨房有历史的view对象,复用历史缓存的view对象:"+position);              view = convertView;              holder = (ViewHolder) view.getTag();              //通过封装成对象的方式性能优化5%,很小,这里不给出Holder类,不如内存地址复用效果显著          }          holder.tv_number.setText(infos.get(position).getNumber());          String mode = infos.get(position).getMode();          //删除事件响应,这里留着以后用          holder.iv_delete.setOnClickListener(new OnClickListener() {              @Override              public void onClick(View v) {                  AlertDialog.Builder builder = new Builder(CallSmsSafeActivity.this);                  builder.setTitle("警告");                  builder.setMessage("确定要删除这条记录么?");                  //DialogInterface接口类方法                  builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {                      @Override                      public void onClick(DialogInterface dialog, int which) {                          //删除数据库的内容                          dao.delete(infos.get(position).getNumber());                          //更新界面。                          infos.remove(position);                          //通知listview数据适配器更新                          adapter.notifyDataSetChanged();                      }                  });                  builder.setNegativeButton("取消", null);                  builder.show();              }          });          return view;      }  

实现方法看代码分析。顺便提一下,代码中有删除操作代码,重点看在增加删除后数据如何更新到ListView中的,就是adapter.notifyDataSetChanged()方法。

相关栏目:

用户点评