欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Android中怎么提升ListView的性能

Android 中怎么提升ListView的性能,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

閬中網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。成都創(chuàng)新互聯(lián)公司于2013年開始到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司。

ListView如何運(yùn)作的?

ListView是設(shè)計(jì)應(yīng)用于對(duì)可擴(kuò)展性和高性能要求的地方。實(shí)際上,這就意味著ListView有以下2個(gè)要求:

  1. 盡可能少的創(chuàng)建View;

  2. 只是繪制和布局在屏幕上可見的子View。

理解***點(diǎn)很簡(jiǎn)單:通過布局xml文件在創(chuàng)建View并顯示是很昂貴耗時(shí)耗資源的操作。盡管布局文件已經(jīng)編譯打包成了二進(jìn)制形式以便于更高效的語(yǔ)法解析,但是創(chuàng)建View仍然需要通過一個(gè)特殊的XML樹,并實(shí)例化所有需要響應(yīng)的View。

ListView通過回收一些不可見的Views,通常在Android源碼中稱為“ScrapView(廢棄的View)”來解決這個(gè)問題。這及意味著開發(fā)者只需要簡(jiǎn)單的更新每行的內(nèi)容而不需要針對(duì)每個(gè)單獨(dú)的行的布局來創(chuàng)建View。

為了實(shí)現(xiàn)第二點(diǎn),在我們滑動(dòng)屏幕時(shí),ListView通過使用View回收器來增加低于或者高于當(dāng)當(dāng)前窗口的Views,并當(dāng)前活動(dòng)的Views移動(dòng)到一個(gè)可回收池中。這樣的話,ListView只需要在內(nèi)存中保持足夠多的Views去填充分配空間中的布局和一些額外的可回收Views,即使當(dāng)你的Adapter有上百個(gè)items的適合。它會(huì)使用不同的方法去填充行之間的空間,從頂部或者底部等等,具體取決于窗口是如何變化的。

下面這個(gè)圖很直觀的展示了當(dāng)你按下ListView的時(shí)候發(fā)生了什么:

Android 中怎么提升ListView的性能

通過上述介紹,相比我們已經(jīng)熟悉了ListView的這種機(jī)制,讓我們繼續(xù)前往技巧部分。正如上述介紹的,在滑動(dòng)時(shí),ListView通過動(dòng)態(tài)的創(chuàng)建和回收很多View,實(shí)現(xiàn)了盡可能地讓Adapter的getView()輕量。所有的技巧都是通過多種方法讓getView()更快。

View的回收

當(dāng)ListView每次需要在屏幕上顯示新的一行的時(shí)候,會(huì)從其Adapter中調(diào)用getView()的方法。眾所周知,getView()方法有3個(gè)參數(shù):行的位置, convertView以及父ViewGroup。

參數(shù)convertView說穿來就是之前講述的ScrapView。當(dāng)ListView要求更新一行的布局時(shí),convertView是一個(gè)非空值。因此,當(dāng)convertView值非空時(shí),你僅僅需要更新內(nèi)容即可,而不需要重新一個(gè)新行的布局。getView()在Adapter中一般是如下的形式:

public View getView(int position, View convertView, ViewGroup parent) {     if (convertView == null) {         convertView = mInflater.inflate(R.layout.your_layout, null);     }      TextView text = (TextView) convertView.findViewById(R.id.text);     text.setText("Position " + position);      return convertView; }

View Holder如何寫的模板

Android很常見的一個(gè)操作就是在布局文件中找到一個(gè)內(nèi)部的View。通常是使用一個(gè)findViewById()的View方法來實(shí)現(xiàn)的。這個(gè)findViewById()方法在View樹中,根據(jù)一個(gè)View ID,會(huì)遞歸的被調(diào)用來找到其子樹。雖然在靜態(tài)UI布局中使用findViewById()是完全正常的。但是,在滑動(dòng)時(shí),ListView調(diào)用其Adapter中的getView()是非常頻繁的。findViewById()可能會(huì)影響ListView滑動(dòng)時(shí)的性能,尤其是你的行布局是很復(fù)雜的時(shí)候。

尋找一個(gè)充氣布局內(nèi)的內(nèi)部觀點(diǎn)是在Android上最常用的操作之一。這通常是通過一個(gè)名為findViewById(查看方法完成)。此方法將遞 歸經(jīng)過視圖樹尋找一個(gè)孩子用給定的ID碼。靜態(tài)的UI布局使用findViewById()是完全正常,但正如你所看到的,ListView中滾動(dòng)時(shí)調(diào)用 適配器的getView()非常頻繁。  findViewById()可能perceivably擊中ListViews,尤其是滾動(dòng)的性能,如果你行的布局是不平凡的。

View Holder的模式就是減少在Adapter中g(shù)etView()方法中調(diào)用findViewById()次數(shù)。實(shí)際上,View Holder是一個(gè)輕量級(jí)的內(nèi)部類,用于直接引用到所有內(nèi)部views。在創(chuàng)建View之后,你可以在每行的View存儲(chǔ)為一個(gè)標(biāo)簽。通過這種方法,只需要在初次創(chuàng)建布局的時(shí)候調(diào)用findViewById()。下面是一個(gè)使用上述方法的View Holder模板的代碼示例:

public View getView(int position, View convertView, ViewGroup parent) {     ViewHolder holder;      if (convertView == null) {         convertView = mInflater.inflate(R.layout.your_layout, null);          holder = new ViewHolder();         holder.text = (TextView) convertView.findViewById(R.id.text);          convertView.setTag(holder);     } else {         holder = convertView.getTag();     }      holder.text.setText("Position " + position);      return convertView; }  private static class ViewHolder {     public TextView text; }

異步加載

很多時(shí)候,Android應(yīng)用在ListView每行中顯示一些多媒體內(nèi)容,比如圖片等。在Adapter中的getView()使用應(yīng)用內(nèi)置的圖片資源還是不會(huì)出什么問題的,因?yàn)榭梢源鎯?chǔ)在Android的高速緩存中。但當(dāng)你想多態(tài)的顯示來自本地磁盤或網(wǎng)絡(luò)的內(nèi)容時(shí),例如縮略圖,簡(jiǎn)歷圖片等。在這種情況下,你可能不希望直接在Adapter中的getView()加載它們,因?yàn)镮O進(jìn)程會(huì)阻塞UI線程。如果這樣做的話,ListView就看起來非常卡頓。

在一個(gè)單獨(dú)的線程,如果想要運(yùn)行的所有行的IO操作或任何高負(fù)載CPU限制的異步操作。其中的技巧就是要做到符合ListView的回收行為。例如,如果在Adapter中的getView()中,使用AsyncTask的加載去加載資料圖片,在AsyncTask完成之前,你正在加載的圖片View就有可能被回收用于其他地方。所以,一旦異步操作完成的同時(shí),需要一種機(jī)制來知道如果相應(yīng)的View有沒有被回收。

一個(gè)簡(jiǎn)單的方法來實(shí)現(xiàn)這一目標(biāo)是通過附加一些標(biāo)識(shí)該行與它相關(guān)的View的信息。然后,當(dāng)異步操作完成的適合,檢查目標(biāo)行的View和標(biāo)識(shí)的View是否一致。實(shí)現(xiàn)這一目標(biāo)的方法很多。下面是實(shí)現(xiàn)這種方法的一個(gè)很簡(jiǎn)單的示例:

public View getView(int position, View convertView,         ViewGroup parent) {     ViewHolder holder;      ...      holder.position = position;      new ThumbnailTask(position, holder)             .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);      return convertView; }  private static class ThumbnailTask extends AsyncTask {     private int mPosition;     private ViewHolder mHolder;      public ThumbnailTask(int position, ViewHolder holder) {         mPosition = position;         mHolder = holder;     }      @Override     protected Cursor doInBackground(Void... arg0) {         // Download bitmap here     }      @Override     protected void onPostExecute(Bitmap bitmap) {         if (mHolder.position == mPosition) {             mHolder.thumbnail.setImageBitmap(bitmap);         }     } }  private static class ViewHolder {     public ImageView thumbnail;     public int position; }

人機(jī)交互知識(shí)

做到在每一行異步加載很多資源,是一個(gè)高性能的ListView的必經(jīng)之路。但是,在滑動(dòng)屏幕時(shí),如果你一味的在每一個(gè)getView()調(diào)用里面都去啟動(dòng)一個(gè)異步的操作,造成的結(jié)果就是你會(huì)浪費(fèi)大量資源。因?yàn)樾斜活l繁回收,造成大部分返回的結(jié)果會(huì)被丟棄。

考慮到實(shí)際的人機(jī)交互情況,在ListView適配器中,在每一行中都不應(yīng)該去觸發(fā)任何異步操作。也就是說,在ListView中有fling(快速滑動(dòng))操作時(shí),啟動(dòng)任何異步操作都沒有任何意義。一旦滾動(dòng)停止或即將停止,才是開始真正顯示每行的內(nèi)容的時(shí)候。

我不會(huì)發(fā)布一個(gè)代碼示例貼在這里,因?yàn)槠渲猩婕暗降拇a太多。Romain Guy寫了一個(gè)很經(jīng)典的應(yīng)用:Shelves app,其中有一個(gè)很好的的示例。當(dāng)GridView停止滑動(dòng)時(shí)不做其他事情時(shí),它就開始觸發(fā)從而去異步加載書的封面資源。即使在滑動(dòng)時(shí),你也可以展示緩存中的內(nèi)容,通過使用memory cache來平衡交互。這真是個(gè)好主意!

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。

本文標(biāo)題:Android中怎么提升ListView的性能
鏈接分享:http://aaarwkj.com/article24/igosce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、面包屑導(dǎo)航網(wǎng)站設(shè)計(jì)公司、ChatGPT、微信小程序、Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)
亚洲精品午夜久久久伊人| 91在线看片国产免费观看| 精品亚洲美无人区乱码| 雪白肥臀视频一区二区三区| 亚洲国产成人av精品精品国产自| 国产精品国产三级国产av一区| 日韩成人手机视频在线观看| 欧美精品一区影片在线观看| 成年人午夜在线观看网址| 国内外成人皇色视频| 最新日本免费久久精品| 福利一区二区在线视频| 国产精品伦理一区二区三区| 国产欧美一区二区另类精品| 日韩精品免费在线观看视频网站| 日韩精品一区二区三区人妻视频| 亚洲高清中文字幕专区| 一级黄片电影中文字幕| 日韩精品成人一区二区三区免费| 特别黄的日本免费视频| av永久天堂一区二区三区| 成人免费激情在线观看| 亚洲av二区三区成人| 抱着操才爽的免费视频观看| 亚洲国产精品二区三区| 五十路八十路息与子交尾| 亚洲麻豆精品午夜免费| 久久精品国产亚洲av无| 亚洲精品亚洲一区亚洲二区| 国产精品黄色91熟女| 亚洲成av人天堂影院| 黄色片黄色片美女黄色片亚洲黄色片| 精品熟妇人妻一区二区三区| 亚洲欧美半夜激情一区二区| 日本人妻系列在线播放| 91最新精品丝袜国产在线| 精品人妻中文字幕在线| 亚洲天堂欧美日韩一区| 国产日韩欧美亚洲中文国| 欧美成人精品欧美一级黄片| 亚洲日本韩国福利久久|