中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

Android加載數(shù)據(jù)ListView優(yōu)化內(nèi)存實(shí)現(xiàn)

2018-07-20    來(lái)源:open-open

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬(wàn)Linux鏡像隨意使用

問(wèn)題分析

在移動(dòng)端項(xiàng)目開(kāi)發(fā)中,基于加載大數(shù)據(jù)量的原因,經(jīng)常出現(xiàn)內(nèi)存溢出的現(xiàn)象,那么減少內(nèi)存占用,在真實(shí)開(kāi)發(fā)中著實(shí)很重要,下面介紹下ListView加載數(shù)據(jù)量大時(shí)解決思路:

我們應(yīng)該碰到過(guò)這樣的情況,對(duì)于加載的listview,我們慢慢滑動(dòng)數(shù)據(jù)時(shí),系統(tǒng)加載數(shù)據(jù)沒(méi)有問(wèn)題,但是當(dāng)加快滑動(dòng)數(shù)據(jù)時(shí),就會(huì)出現(xiàn)內(nèi)存溢出的問(wèn) 題(這里不考慮分頁(yè)加載方法)?偨Y(jié)這是因?yàn)槭謾C(jī)屏幕顯示的原因,每次加載數(shù)據(jù)是有限的,慢慢滑動(dòng)數(shù)據(jù),在加載數(shù)據(jù)的同時(shí),系統(tǒng)能有時(shí)間回收不用的內(nèi)存, 才不會(huì)暴露問(wèn)題,但是,加快滑動(dòng),內(nèi)存回收GC來(lái)不及,慢慢內(nèi)存就滿了。知道了原因,加大內(nèi)存,減慢滑動(dòng)速度顯然不是好的方案,實(shí)現(xiàn)內(nèi)存重復(fù)使用才是最重 要的。

解決方案

我們知道,數(shù)據(jù)最后顯示在手機(jī)屏幕,是通過(guò)Adapter適配器來(lái)實(shí)現(xiàn)的,在其默認(rèn)實(shí)現(xiàn)方法getView()方法中,我們實(shí)現(xiàn)如下代碼:

    //有多少個(gè)條目被顯示,這個(gè)方法就會(huì)被調(diào)用多少次  
    @Override  
    public View getView(final int position, View convertView, ViewGroup parent) {  
        View view;  
        ViewHolder holder;  
        //1.減少內(nèi)存中view對(duì)象創(chuàng)建的個(gè)數(shù)(優(yōu)化listView,避免內(nèi)存溢出)  
        if(convertView==null){  
            Log.i(TAG,"創(chuàng)建新的view對(duì)象:"+position);  
            //把一個(gè)布局文件轉(zhuǎn)化成  view對(duì)象。  
            view  = View.inflate(getApplicationContext(), R.layout.list_item_callsms, null);  
            //2.減少子孩子查詢的次數(shù)  內(nèi)存中對(duì)象的地址。  
            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);  
            //當(dāng)孩子生出來(lái)的時(shí)候找到他們的引用,存放在記事本,放在父親的口袋  
            view.setTag(holder);  
        }else{  
            Log.i(TAG,"廚房有歷史的view對(duì)象,復(fù)用歷史緩存的view對(duì)象:"+position);  
            view = convertView;  
            holder = (ViewHolder) view.getTag();  
            //通過(guò)封裝成對(duì)象的方式性能優(yōu)化5%,很小,這里不給出Holder類,不如內(nèi)存地址復(fù)用效果顯著  
        }  
        holder.tv_number.setText(infos.get(position).getNumber());  
        String mode = infos.get(position).getMode();  
          
        //刪除事件響應(yīng),這里留著以后用  
        holder.iv_delete.setOnClickListener(new OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                AlertDialog.Builder builder = new Builder(CallSmsSafeActivity.this);  
                builder.setTitle("警告");  
                builder.setMessage("確定要?jiǎng)h除這條記錄么?");  
                //DialogInterface接口類方法  
                builder.setPositiveButton("確定", new DialogInterface.OnClickListener() {  
                    @Override  
                    public void onClick(DialogInterface dialog, int which) {  
                        //刪除數(shù)據(jù)庫(kù)的內(nèi)容  
                        dao.delete(infos.get(position).getNumber());  
                        //更新界面。  
                        infos.remove(position);  
                        //通知listview數(shù)據(jù)適配器更新  
                        adapter.notifyDataSetChanged();  
                    }  
                });  
                builder.setNegativeButton("取消", null);  
                builder.show();  
            }  
        });  
        return view;  
    }  

實(shí)現(xiàn)方法看代碼分析。順便提一下,代碼中有刪除操作代碼,重點(diǎn)看在增加刪除后數(shù)據(jù)如何更新到ListView中的,就是adapter.notifyDataSetChanged()方法。

標(biāo)簽: 大數(shù)據(jù) 代碼 數(shù)據(jù)庫(kù)

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:原生js的RSA和AES加密解密

下一篇:JavaScript SHA-256加密算法詳細(xì)代碼