Android加載數據ListView優化內存實現

n6xb 9年前發布 | 1K 次閱讀 Java Android

問題分析

在移動端項目開發中,基于加載大數據量的原因,經常出現內存溢出的現象,那么減少內存占用,在真實開發中著實很重要,下面介紹下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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!