麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 系統(tǒng) > Android > 正文

Android開發(fā)筆記之:深入理解Cursor相關的性能問題

2020-04-11 12:23:11
字體:
供稿:網(wǎng)友

當數(shù)據(jù)庫中存有大量數(shù)據(jù)的時候,用Cursor查詢時要注意,有可能引發(fā)性能問題。數(shù)據(jù)庫查詢出來的Cursor都會由一個CursorWindow來進行數(shù)據(jù)管理,包括內(nèi)存空間的申請和數(shù)據(jù)的填充。CursorWindow對Cursor中的內(nèi)容大小有限制,限制為1024*1024也就是1M,換句話說Cursor中數(shù)據(jù)的大小不能超過1M,如果超過1M會引發(fā)如下的錯誤:

復制代碼 代碼如下:

08-23 05:48:31.838: DEBUG/Cursor(1805): skip_rows row 149
08-23 05:48:31.844: ERROR/CursorWindow(1805): need to grow: mSize = 1048576, size = 11499, freeSpace() = 7397, numRows = 80
08-23 05:48:31.844: ERROR/CursorWindow(1805): not growing since there are already 80 row(s), max size 1048576
08-23 05:48:31.844: ERROR/Cursor(1805): Failed allocating 11499 bytes for blob at 228,7
08-23 05:48:31.849: DEBUG/Cursor(1805): finish_program_and_get_row_count row 12
08-23 05:48:31.851: DEBUG/browser/BrowserBookmarkFoldersAdapter(1805): getView()-Position:149
08-23 05:48:32.019: DEBUG/Cursor(1805): skip_rows row 148

這表明CursorWindow中的空閑空間已經(jīng)不足,已經(jīng)在申請新的空間,但似乎申請失敗。這個錯誤有時候會導致查詢得到的Cursor為null,有時候不會引發(fā)太嚴重的問題。但是它會引起性能上的問題,不停的申請空間會占用大量的CPU時間,從而導致整個手機變卡。特別是在ListView或GridView中綁定的Cursor,會導致無法滑動,或者滑動變的十分的卡。用Android2.3的原生Browser,打開其中的歷史記錄,當有超過200條歷史記錄時,不停的滑動,特別是由下向上滑時會變的十分的卡,而對于其書簽,如果條目超過100,且每個都有縮略圖時,滑動會變得特別的卡,甚至都打不開,就是這個原因。
這個問題沒有根本的解法,這是Android系統(tǒng)的限制,唯一可行的就是想辦法避免,也就是盡可能讓Cursor的大小 小于1M,以下是可行的方法:
1. 只查詢需要的字段
這個特別重要,根據(jù)UI顯示的需要,或者實際的需要查詢需要的字段。就是一定要給ContentResolver.query(uri, projection)第二個參數(shù)PROJECTION,如果這個參數(shù)為null,那么就會查詢表中所有的字段,那么當條數(shù)一增加Cursor的大小 會增長很快。Browser中歷史記錄的原因就是它在query的時候查詢了所有的字段,其數(shù)所庫中保存了favicon和thumbnail二進制文件,因此當包含了這二個字段時,Cursor的容量很容易就達到了限制。
2. 二進制文件不要存在數(shù)據(jù)庫中
數(shù)據(jù)庫僅適用于保存一些較短文字,整數(shù),布爾,浮點數(shù)等一些,易于查詢和操作的輕量級的數(shù)據(jù),目的也是在于快速搜索和查詢。對于像圖片,較長的文字(如文章)等大數(shù)據(jù),最好直接以文件形式存儲在硬盤中,然后在數(shù)據(jù)庫保存它們的訪問路徑。對于像favicon這樣的小圖片也可以考慮存在數(shù)據(jù)庫中,但是像對于thumbnail的圖片就不明智,除非整個應用在數(shù)量上有限制(比如只有幾十或百級)否則很容易在查詢的時候達到1M的限制。
3. 對于特別大量的數(shù)據(jù)超過5000級或萬級或十萬級或百萬級的要分段查詢
無論表中的一條記錄數(shù)據(jù)量如何的小,當條數(shù)達到5000級或者萬級或者更多的時候,還是會達到1M的限制,這時就需要分段查詢,比如每次查詢500個,或者1000個。另外,如果是要做展示用,這么多數(shù)據(jù)一下子出來,用戶也不方便查看。
【實例】Android2.3書簽,歷史記錄和最多訪問三個頁面當數(shù)據(jù)量達到300左右時,就會出現(xiàn)滑動很卡的現(xiàn)象,特別是由下向上滑動時,特別的卡,會狂打出:
復制代碼 代碼如下:

08-23 05:48:31.844: ERROR/CursorWindow(1805): need to grow: mSize = 1048576, size = 11499, freeSpace() = 7397, numRows = 80
08-23 05:48:31.844: ERROR/CursorWindow(1805): not growing since there are already 80 row(s), max size 1048576
08-23 05:48:31.844: ERROR/Cursor(1805): Failed allocating 11499 bytes for blob at 228,7

這樣的LOG。而書簽似乎都沒有辦法打開和滑動,其特別的卡。
究其原因就是它們在查詢的時候都用了同一個字段集Browser.HISTORY_PROJECTION這個是把bookmarks表中的所有字段都 查詢出來。書簽,歷史記錄和最多訪問雖是三個不同的展示頁,但它們的數(shù)據(jù)是相同的都是來自bookmarks表。Bookmarks表中存有_id,title,url,bookmark,favicon,touch_icon,thumbnail等字段,其中favicon和thumbnail是二進制圖片數(shù)據(jù)(byte[])。Browser.HISTORY_PROJECTION里面包含了所有的字段,當然也包含了favicon和thumbnail,所以當條目一旦達到200多時,Cursor就會達到其1M的限制,因此會導致性能下降,滑動變卡。

事實上對于歷史記錄和最多訪問二個頁面來講thumbnail和touch_icon根本就沒有用到,它只需要_id,title,url,bookmark和favicon;對于書簽頁,也僅是在GRID時才用到thumbnail。所以,只需要把查詢時的字段集Browser.HISTORY_PROJECTION中的THUMBNAIL去掉,即可以解決滑動變卡。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 久久久久久久.comav | 72pao成人国产永久免费视频 | 久久久成人精品视频 | 成人在线视频播放 | 亚洲成人国产综合 | 免费国产在线视频 | 国产毛片在线看 | 99国产精品自拍 | 中文字幕专区高清在线观看 | h色网站免费观看 | 一级观看免费完整版视频 | 欧美精品a∨在线观看不卡 午夜精品影院 | 国产九色91 | 91成人免费在线观看 | 91久久国产综合久久91精品网站 | 亚洲人成在线播放 | 黑色丝袜美美女被躁视频 | 亚洲成人免费网站 | 亚洲码无人客一区二区三区 | 免费黄网站在线播放 | 精品亚洲视频在线 | 国产亚洲在 | 久久久免费观看完整版 | 国产91久久精品一区二区 | 精品久久中文网址 | 在线看一区二区三区 | 99国产精品欲a| 国产精品欧美日韩一区二区 | 91网站免费在线观看 | 免费黄色成人 | 草草视频在线播放 | 男女羞羞视频在线免费观看 | 1024亚洲天堂 | 国产一级做a | 黄视频免费在线 | 久久久久久免费 | 精品一区二区久久久久久按摩 | 久久精品观看 | 黄色特级片黄色特级片 | 国产激情网 | 777sesese |