王 結, 魏振鋼
(中國海洋大學 信息科學與工程學院學院, 青島 266100)
Android平臺下快速加載圖文信息的研究與實現①
王 結, 魏振鋼
(中國海洋大學 信息科學與工程學院學院, 青島 266100)
為了加快Android移動端圖文信息的加載速度, 方便用戶快速瀏覽界面獲取相關信息, 在汲取前人的相關技術基礎上, 結合了Android圖像開源視圖smart-Image-View、網絡請求框架android-async-http以及分頁顯示技術. 采用大量圖文數據做實驗, 結果表明三種方法的結合使用明顯提高了圖文加載速度.
圖文信息; 加載速度; 圖像開源視圖; 網絡請求框架; 分頁顯示
隨著Android平臺的應用不斷涌現, 為了提高App內容的簡潔直觀性, 開發者偏向以圖文信息的形式來布局界面內容. 例如目前廣泛受到用戶關注的購物App, QQ、微信等聊天軟件以及各種題庫軟件等都少不了圖文內容的展示. 然而由于數據庫內容的不斷增多,在Android端前臺界面要顯示的圖文信息也愈發增多.因此, 尋求新的技術方法來加快圖文信息的加載速度,增強用戶體驗性是非常有必要的.
Android平臺的應用開發主要采用MVC框架[1],通過控制層、模型層以及視圖層之間的通信, 完成對圖文信息的加載, 具體過程是Android端前臺的Activity將用戶的請求信息交于模型業務邏輯層(即后臺相關的Servlet)處理, 之后Servlet從服務器中獲取相關的圖文信息以Json數據包[2]形式返回給前臺, 再由前臺視圖層(即相應的XML)處理顯示. 具體的通信過程如圖1所示.
而圖片在服務器中的存儲格式一般是字符串形式的URL, 當前臺從Json數據包中解析出各種數據后,文字可以立即顯示出來, 但由于獲取到的圖片是其URL形式存儲的, 需通過URL再次訪問后臺來獲取圖片資源. 這樣不僅使得代碼量繁雜同時也大大降低了圖片的加載速度.
為了解決圖片和文字加載速度的不同步問題, 查閱了相關的文獻期刊, 先后有AsyncHttpClient框架[3]、用于獲取網絡圖片的Universal-Image-Loader框架以及Volley網絡通信框架被推出應用到網絡圖片加載中,表1所示為這三種網絡通信框架[4]的特點比較.

圖1 Android端MVC通信過程

表1 三種網絡通信框架的特點比較
通過分析比較可以看出這三種網絡框架都有各自的優缺點, 應用的比較好的是Volley框架, 可以實現多線程請求, 穩定性及高, 同時還提供緩存功能. 但在只加載圖文信息的具體項目中, 若采用這種框架實現, 空間占用太大, 且代碼存在冗余, 反而使得程序更加復雜化. 而本文采用的框架是集多線程、緩存機制、代碼量少于一體的Android圖像視圖控件smart-Image-View[5].
smart-Image-View可以實現各種來源的圖片資源獲取. 根據來源的不同, smart-Image-View定義了一個公共接口SmartImage, 用不同的類分別來實現該接口下的一個getBitmap函數. 如圖2所示是smart-Image-View的基本框架.

圖2 smart-Image-View基本框架
將smart-Image-View控件取代ImageView應用到圖片加載中, 只需調用自定義控件SmartImageView的setImageUrl方法, 即可從指定的URL路徑中讀取圖片資源并部署在該控件上.
同時, smart-Image-View通過WebImage類下的WebImage Cache實現了圖片的緩存. WebImage類根據URL獲取資源時, 并不是每次都要從網絡上加載, 而是實現了二級緩存, 即內存緩存和磁盤緩存. 每次加載時, 先要判斷該URL對應的圖片是否已存在于緩存中, 若有, 直接從緩存中獲取, 反之, 再從URL上加載. smart-Image-View在圖文內容加載上的應用使得圖片資源和文字實現了幾乎同步顯示的效果, 并且節約了用戶的下載流量和載入時間.
Http網絡數據交互請求是Android端應用程序開發關鍵部分之一, 網絡請求方式的效率和性能直接影響到App的整體用戶體驗流暢性. 以往Android端的網絡請求處理一般使用Apache HTTP Client或者HttpURLConnect這兩個類庫, 同時需要編寫大量的get和post方法完成請求, 并且網絡請求都會占用UI線程, 使得其他操作無法進行, 遇到網絡異常情況還會出現程序無響應現象. 對于這些問題, 開發者們提出過很多的優化方案, 譚東等人在《Android網絡負載請求優化方案設計》[6]一文中提出了幾個網絡優化方法, 創建網絡請求線程管理池, 使用優先級請求排序策略以及網絡請求及時回收等, 都能很好地達到優化效果. 而本文提出的android-async-http[7]開源框架則是集成了這些優化思想, 實現了一個異步網絡請求處理庫, 獨立在UI主線程之外, 通過線程池的網絡請求回調方法處理請求結果.
將android-async-http應用到圖文信息加載上的優勢有幾點: 第一, 移動端應用要考慮到網絡移動連接的不穩定性, App在加載圖文信息的過程中網絡一旦斷開, 信息將無法顯示出來, 而android-async-http框架實現了網絡的自動智能請求重試, 在請求失敗的情況下可以設置多次請求; 第二, App端向服務器請求獲取相關圖文信息時, 利用后臺Servlet將數據打包成Json格式返回給前臺后, 一般都需要進行相當費時的一系列格式轉換處理才能顯示給用戶瀏覽. 而android-async-http框架內置了一個JsonHttpResponseHandler解析類, 可以實現自動化高效地Json格式數據解析, 大大縮短了圖文數據從返回前臺到顯示于界面這一時間過程. 第三, android-async-http框架具有持久化cookie存儲的特點,在請求服務器時能夠將訪問到的cookie信息方便的存儲起來.
隨著數據庫技術在網絡領域的廣泛應用, Android端與數據庫交互信息的顯示方式也在不斷地創新和改進. 傳統的方法是Android端一次性向后臺Servlet請求所有相關圖文信息, Servlet得到命令后從數據庫中獲取所有符合條件的圖文信息并打包成Json數據發送給前臺. 這種方法顯然在數據信息較大的情況下使用會明顯降低加載速度; 之后有了分頁處理[8]的思想,即利用結果集處理. 通過首次執行SQL語句, 將查詢結果存于結果集對象中, 之后前臺的每次請求數據,實際上是在結果集中獲取指定行位置的數據, 這一過程雖然減少了對數據庫SQL語句的查詢, 但數據庫仍要一直保持連接狀態, 使得占用的數據庫訪問資源比較多, 而利用率不高. 而針對Android端請求的圖文信息量大的情況, 本文提出了分頁顯示技術, 即利用SQL語句處理, 在前臺界面加載時, 只向后臺數據庫請求固定行數的圖文信息, 存于結果集, 并顯示在列表視圖中, 等到需要查看更多時, 再向數據庫請求加載. 這樣雖然對數據庫進行SQL語句查詢操作變得頻繁, 但數據庫的訪問資源使用完畢之后就立即被釋放.
首先在Android端和后臺模型層分別創建一個用于傳遞分頁信息的數據包PageBean類, 該類包含了分頁的具體信息(如數據總行數, Android端當前顯示頁號, 總顯示頁數, 每頁顯示行數)和分頁數據(每頁中顯示的List數據集), 前臺向后臺模型層傳遞每頁顯示的行數和當前顯示頁號, 后臺相應Servlet通過doPost方法接收前臺傳遞來的數據參數后, 調用實現DAO接口的具體類的方法訪問數據庫, 獲取相關信息打包存于PageBean類的對象中, 以Json包的形式返回給前臺.該過程的具體實現如圖3所示.

圖3 Android端分頁顯示具體實現過程
該過程中使用了數據訪問模型[9,10](Data Access Object), 它是處于業務邏輯層與數據源之間的一種抽象數據源, 通過DAO層的抽象, 將具體的業務邏輯層和數據源區分開, 其實質是向外部提供了一個訪問數據源的統一接口, 對外隱藏操作數據源的實現細節,從而提高軟件的可維護性.
在前臺界面XML文件中引用了smart-Image-View圖像開源視圖作為圖片的顯示容器. 實驗結果顯示前臺讀取商品信息時, 文字和圖片幾乎是同時加載出來的, 說明圖片的加載速度有了明顯的提高. 圖4和圖5所示為用ImageView視圖容器和smart-Image-View視圖容器加載圖片的效果顯示. 從中可以明顯看出使用smart-Image-View的優勢.
而在App端應用android-async-http網絡請求框架也是比較簡便的, 首先需要將該框架的jar包添加到Android應用程序libs文件中, 再創建一個AsyncHttpClient對象, 并通過RequestParams對象設置請求參數, 然后調用Async -HttpClient的某個get或post方法, 傳遞你需要的callback接口實現AsyncHttpResponseHandler. 實現代碼如圖6所示.

圖4 ImageView視圖 容器加載的效果

圖5 smart-Image-View 視圖容器加載的效果

圖6 android-async-http框架的具體代碼實現
代碼中HttpUtil是一個自定義的網絡請求工具類,它將AsyncHttpClient對象和各種含不同參數的get和post方法封裝在一起. 這樣實現的優點是可以避免網絡請求處理時AsyncHttpClient對象的反復創建.
Web端的分頁處理技術應用到Android移動端上,首先要對前臺用于顯示圖文信息的ListView或GridView設置滾動監聽事件, 當用戶滑動到已加載的最后一條信息時, 將當前顯示頁號和每頁顯示總行數傳遞到后臺Servlet, 通過DAO方法訪問數據庫加載指定數量的圖文內容. 監聽滾動事件的核心代碼如圖7所示.

圖7 前臺ListView或GridView的滾動事件的監聽
而訪問數據庫加載更多圖文信息是通過SQL語句查詢來實現的, 由于實現的效果是分頁顯示, SQL語句在書寫時, 要傳入當前行號和指定獲取的行數等參數, 具體代碼如圖8所示.

圖8 后臺SQL語句查詢實現的PageBean數據獲取代碼
為了提高Android端圖文信息的加載速度, 本文是從三個方面考慮的: 一是從信息本身特點出發; 二是從網絡請求處理方式上考慮; 三是從數據庫訪問方式上出發. Android開源圖像視圖smart-Image-View和開源框架android-async-http的設計是廣大Android編程愛好者不斷修改創新的成果, 而分頁顯示技術則是在借鑒Web端分頁處理數據的基礎上應用到Android移動端的. 這三種方法結合使用到加載圖文信息上可以為其他App端項目開發提供參考價值.
1 任中方,張華,閆明松,陳世福.MVC模式研究的綜述.計算機應用研究,2004,21(10):1–4,8
2 高靜,段會川.JSON數據傳輸效率研究.計算機工程與設計, 2011,32(7):2267–2270.
3 Zhao Z, Song JD, Haihong E. Research and design for mobile application development on Android platform. The Journal of New Industrialization, 2013, 3(6): 78–89.
4 孟遠.Android網絡通信框架Volley的解析和比較.軟件,2014,(12):66–68.
5 Smith J. Android Smart Image View. http://loopj.com/ android- smart-image-view/.
6 譚東,楊德剛.Android網絡負載請求優化方案設計.中國新通信,2015,(2):107–108.
7 Smith J. Android Asynchronous HttpClient. http://loopj.com/ android-async-http/.
8 盧成均. ASP.NET中數據列表分頁方法研究.計算機系統應用,2006,15(11):83–86.
9 王正玉,李斌.基于DAO模式的Hibernate框架在Java Web開發中的應用.微型機與應用,2015,(11):14–17.
10 歐陽宏基,解爭龍,黃素萍,丁要軍.一種基于DAO設計模式與Hibernate框架的數據持久化層模型.微計算機應用,2009,30(3):36–40.
Research and Implementation of Rapid Loading Picture and Text Information Based on Android
WANG Jie, WEI Zhen-Gang
(College of Information Science and Engineering, Ocean University of China, Qingdao 266100, China)
This paper proposes the issue that we should speed up the loading rate of image and text information on the Android mobile terminal, and meanwhile make users convenient to fast access to relevant information by browsing interface. On the basis of the relevant technology, this paper combines the Android image open source view with smart-Image-View, Network request framework, android-async-http and paging display technology. After using a large number of textual and graphic data to do the experiment, the result shows that the combination use of the three methods made it success to improve the loading rate of image and text information.
image and text information; loading rate; image open source view; network request framework; paging display
2016-03-18;收到修改稿時間:2016-04-24
10.15888/j.cnki.csa.005466