Android加載數據ListView優化內存實現
問題分析
在移動端項目開發中,基于加載大數據量的原因,經常出現內存溢出的現象,那么減少內存占用,在真實開發中著實很重要,下面介紹下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; } </pre>
實現方法看代碼分析。順便提一下,代碼中有刪除操作代碼,重點看在增加刪除后數據如何更新到ListView中的,就是adapter.notifyDataSetChanged()方法。
本文由用戶 n6xb 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!