20100918 android cache
-
Upload
rroijnoigntroie -
Category
Documents
-
view
6.264 -
download
1
description
Transcript of 20100918 android cache
AndroidでHTTP Cache
(失敗編)2010-09-18
2010-10-03
AndroidでHTTP通信する方法• java.net
• Java標準
• 簡単なHTTP通信を行うHttpURLConnectionクラス
• org.apache.http
• Apache HttpClient 4.0。Androidに標準組込
• HTTP通信のための細かな制御や機能を提供
• android.webkit
• Android固有。AndroidのUIにWebブラウザを組み込む
• HTTP通信ライブラリというか、Webサイト表示コンポーネント
2010-10-03
問題点(HTTP通信)
• AndroidのHTTP通信は、通信速度が遅い場合がある(3G接続時、300kbps~2000kbps)
• 通信速度が遅いと→レスポンスが悪い→ユーザーの使い勝手が悪い
→サーバから一旦取得したリソースは、キャッシュして通信を減らす
2010-10-03
問題点(キャッシュ)
• キャッシュ機能の仕様策定と実装は手間がかかる
• キャッシュの有効期限
• キャッシュの可否(何でもキャッシュすればよいわけではない)
• サーバ側でキャッシュが更新された場合
• 一から仕様策定と実装をするより既にあるものを使う
→HTTP/1.1 Caching
2010-10-03
HTTP/1.1 Caching
• RFC2616で定義
• 殆どのWebサーバ/Webブラウザで対応
• HTTP/1.1 Cachingは、HTTPヘッダでキャッシュ方式を制御
2010-10-03
HTTP/1.1 Caching
• リクエスト用 HTTPヘッダ
• If-Modified-Since
• 日時を指定。指定した日時より新しいコンテンツの場合のみデータを返却するようにサーバに指示。ローカルキャッシュの最新確認に使用される。
• If-None-Match
• 指定したエンティティタグに一致しない場合のみコンテンツを返却するようにサーバに指示。最新情報の取得や競合の排除のために指定される。
2010-10-03
HTTP/1.1 Caching
• レスポンス用 HTTPヘッダ
• Expires
• コンテンツの有効期限を示す
• Last-Modified
• コンテンツの最終更新時刻を示す。If-Modified-Sinceと対で使用
• ETag
• コンテンツの全体や一部を特定する固有値を示す。If-None-
Matchと対で使用
2010-10-03
HTTP/1.1 Caching
• リクエスト/レスポンス共通 HTTPヘッダ
• Cache-Control
• キャッシュのコントロールに関する指示や情報を示す
• Pragma
• 関連するクライアント/Proxy/サーバそれぞれに認識させるための特殊な追加情報を記述する。例: no-cache 指定で無条件に最新リソースを転送させる
2010-10-03
HTTP/1.1 Caching に対応したサーバの実装
• Apacheとかlighthttpdなどの殆どのWebサーバで実装しているかと
• 設定方法は、ググれば出てくる。
• というか、サーバ周りの設定は詳しくないので(略
2010-10-03
HTTP/1.1 Caching に対応したクライアントの実装
• android.webkitは、HTTP/1.1 Caching の機能を実装
• しかし、プログラムから使いにくい。
• しかし、自前で実装するには、手間がかかる。
→Apache HttpClient-Cacheを使用する
2010-10-03
Apache HttpClient-Cacheとは
• Apache HttpClient 4.1の新機能
• HTTP/1.1 Cachingに対応したクライアント機能
• まだ、alpha版(2010年9月現在)
2010-10-03
Apache HttpClient-Cacheの入手先
• 公式URL
• http://hc.apache.org/
• Subversion URL
• http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/httpclient-cache
• jarファイルを作成する場合、http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/
以下をsvn getして、mvn package
• Revision: 990924 を指定してダウンロードする(2010-09-05現在)。990925の修正でSerialize
時にNotSerializableExceptionが発生
• Maven URL
• http://repo1.maven.org/maven2/org/apache/httpcomponents/httpclient-cache/
2010-10-03
Apache HttpClient-Cacheの特徴
• Cachingの実装が、インターフェース: org.apache.http.client.HttpClient の実装クラス: CachingHttpClient に隠蔽
• アプリケーションからは、DefaultHttpClientをCachingHttpClientに変更するだけ
• Android組込のApache HttpClient 4.0でも使用可能(細かい部分は未確認)。
• alpha版なので、まだ安定していない(クラス名の変更もあったり)
2010-10-03
Apache HttpClient-Cacheの特徴
• Cache対象になるHTTPリクエスト
• HTTP 1.1
• Method: GET
• No Header: "Pragma"
• No Header: "Cache-Control: no-store"
• No Header: "Cache-Control: no-cache"
• ※デフォルトの定義は、org.apache.http.impl.client.cache.CacheableRequestPolicy
2010-10-03
Androidプロジェクトへの組込
• Eclipseを起動
• Androidプロジェクトの新規作成
• Java Build PathにApache HttpClient 4.1のjarファイルを追加
2010-10-03
Androidプロジェクトの実装
• Apache HttpClient-Cacheは、HTTP通信周りしか面倒を見てくれない
• Cache Data Read/Write周りの実装が必要
• 必要な機能
• Cache Data Serialize
• キャッシュサイズ管理
• ※org.apache.http.client.cache.HttpCacheStorageインターフェースの実装クラスが必要
2010-10-03
実測結果
条件 CachingHttpClient DefaultHttpClient
Expires: なしLast-Modified: あり
Etag: ありFile Size: 295 KB
281(ms) 122(ms)
Expires: ありLast-Modified: あり
Etag: なしFile Size: 4KB
50(ms) 125(ms)
Expires: ありLast-Modified: なし
Etag: なしFile Size: 8KB
200 (ms) 128 (ms)
※HTTP GETしてからHTTP Responseが返ってくるまでの時間を測定。※5回連続して測定した結果の平均値。※Nexus One (Android 2.2) で測定。Wi-FI接続。※測定ソース: http://www1.axfc.net/uploader/Sc/so/154474.zip
遅い!
遅い!
2010-10-03
Cachingありの方が遅い原因
→CachingHttpClient#execute() が、呼び出している シリアライズの処理が重い?
2010-10-03
まとめ
• Apache HttpClient-Cache を使うと、アプリケーションの変更最小限で、キャッシュ機能を追加できる
• 但し、キャッシュのシリアライズに時間がかかるので、CachingありのほうがCachingなしより遅い→全HTTP Responseをシリアライズしている
• 2010年9月現在、アルファ版なので今後、改善される可能性あり。
• より、パフォーマンスを求めるのであれば、必要なHTTP ResponseだけをCachingするandroid.webkitと同等の処理を実装したほうがいいかも。
2010-10-03
参考URL
• HTTP/1.1: Caching in HTTP
• http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html
• 事例に学ぶWebシステム開発のワンポイント
• http://www.atmarkit.co.jp/fjava/rensai2/webopt12/webopt12.html
• Android によるネットワーキング
• http://www.ibm.com/developerworks/jp/opensource/library/os-android-networking/
2010-10-03
参考書籍
• Webを支える技術
• http://www.amazon.co.jp/dp/4774142042
2010-10-03