terurouメモスマートフォン用の表示で見るterurouメモこの広告は、90日以上更新していないブログに表示しています。2011-07-02Android組込みのHttpComponent(HttpClient)の正しい使い方といくつかのtipsAndroidブログ等に掲載されているHttpComponentのサンプルコードは、重要なところが端折られて紹介されている(というか間違っている事を知らずに書いている疑惑すらある)ことが多いので、正しいサンプルコードを書いておく。HttpComponentsのドキュメントもちゃん読みましょう。あ、Androidのリファレンスにはロクに使い方が書いてないので、あんなゴミだけ読んでてもダメですよ。ResponseHandlerを使ってコードを書くHttpResponseの内部リソースを自動で解放してくれるので、ミスがなくなり、コードも簡潔になる。ブログ等ではHttpResponseを使わないコードもよく掲載されているが、リソースの解放処理が記述されていないことが多いのであまりよろしくない。releaseにあるが、これを見ると煩雑なコードになっていることが判ると思う。HttpClientを使い終わったら必ずgetConnectionManager().shutdown()するこれを忘れるとスレッドプールが開放されず、メモリリークの原因となる。APIでイベントを検索して、レスポンスを文字列として返す例を掲載する。Requestを構築する。Uri.Builderを使うとURIエンコードも適切にやってくれる。HttpClientインタフェースではなくて、実クラスのDefaultHttpClientを使う。実クラスでないとCookieが使えないなど不都合が多い。response.getStatusLine().getStatusCode()でレスポンスコードを判定する。レスポンスデータを文字列として取得する。byte[]として読み出したいときはEntityUtils.toByteArray()を使う。適切なところで行うこと。当然だがshutdown()したインスタンスは通信できなくなる。httpClient.getConnectionManager().shutdown();}この例ではResponseHandlerのようにStringを型パラメータとして指定して、httpClient.execute()の戻り値でStringを返している。null;とすればよい。蛇足であるが、この例のようにレスポンスを文字列として取得するだけであれば、BasicResponseHandlerを使うともっとコード量を減らすことができる。小回りが利かないので(HTTPレスポンスコードをハンドリングしたい場合など)、個人的にはあまり使う機会がないかなぁと思う。[追記]より確実でミスの少ないコードにするため、レスポンスを読み出す処理をEntityUtilsを使った処理に修正した。してもInputStreamを直接扱いたい場合は、以下のように記述する。finallyでInputStreamをclose()したりと、いたって普通のコードだが、念のため。Requestを構築する。以下、GETと同じなので省略する。ように記述すれば良い。ryopeiの日記を参照。apache-mime4j-0.6.jarとhttpmime-4.0.1.jarの2つのJAR追加すれば良い。Core自体のJAR(httpclientとかhttpcoreとか)を追加しろと解説してるブログも散見されるが、追加は不要である。複数のスレッドから単一のHttpClientを使いまわすThreadSafeClientConnManagerを使えば良い。利用する場合は必ずHttpComponent本家ドキュメントを参照のこと。params);通信タイムアウト時間やらのパラメータ設定HttpConnectionParamsとHttpProtocolParamsで設定できる。ここでは前述のThreadSafeClientConnManagerのサンプルにパラメータ設定を追加した例を示す。これについても設定パラメータの詳細についてはHttpComponent本家ドキュメントを参照のこと。面倒なことに標準では対応してないので、自分でgzipを展開する必要がある。}});gzipが有効か判定する処理は以下のようなコードとなる。value.contains("gzip"));}ただ、毎回自分でgzipが有効化を判定するのは非常にだるいので、以下のようなgzipなレスポンスを透過的に扱うことができるラッパーを用意すると楽である。value.contains("gzip"));}画像を読み込んでBitmapクラスとして取得するtipsとして書くほどでもないかも。BitmapFactory.decodeStream()を使うだけ。ブログを書くまでがDeLLa.JSらしいです。(69)月別アーカイブはてなブログをはじめよう!terurouさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。