2012年8月18日土曜日

LruCacheの使い方

TwitterのツイートをListViewに表示するという処理で、TwitterアイコンのキャッシュにLruCacheを使ってみたメモです。

馴れ初め(ダイジェスト)

TwitteアイコンのキャッシュにSoftReferenceを使っていたのですが、2.2 と 2.3 / 4.xで挙動が違って困っていたところ、以下のツイートに出会う。


ということで、Android Training「Caching Bitmaps」で使われていたLruCacheに辿り着いた次第です。
http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

Twitter と 有益な情報をツイートしてくれる方々に感謝です。

コード


使い方

LruCacheはAPI Level 12からのクラスですが
http://developer.android.com/reference/android/util/LruCache.html
Support Libraryに入っているので
http://developer.android.com/reference/android/support/v4/util/LruCache.html
API Level 4から使えるようになっています。

使い方としては
・KeyとValueの型を指定してインスタンス化する
・LruCache#sizeOf()をオーバーライドしてBitmapのByte数を返してあげる
だけです。

Android TrainingのサンプルコードではBitmap#getByteCount()を使っていますがAPI Level 12からのメソッドなので上記の処理に書き換えています。
上記のコードではキャッシュサイズを1MB固定にしていますが、端末のDalvikVMヒープサイズから動的に決めたい場合は、Android TrainingのサンプルコードのようにすればOKです。

あとは、Twitterアイコン画像URLをKeyにBitmapをキャッシュしておいて、画像使用時にImageCache.getImage(Twitterアイコン画像URL)がnullだったら再取得というような処理にしておけばよいかと思います。

まとめ

2.3以降GCがモア アグレッシブになっているので、SoftReferenceを使用した場合、ListViewの行が画面から消えるとすぐに画像キャッシュがクリアされてしまう。
従って、今後はLruCacheを使いましょう。
といったところでしょうか。

LruCacheを利用することで、SoftReferenceを使用した場合の2.2 と 2.3以上でキャッシュの挙動が違うという問題が解決できました。
公式ドキュメントはちゃんとチェックしておかないとダメですね。。

因に僕は、常にこの構成でデバッグしています。
書いたコードに対してすぐにバージョン間の差異が確認できるので良いかなと思っています。
今のところ誰からも賛同を得られていませんが...

Fragmentationと共に生きる方法
http://neta-abc.blogspot.jp/2012/08/fragmentation.html


2012年8月11日土曜日

エミュレーター・実機に文字列を流し込む方法

最近多用している便利なコマンドのメモです。

adb shell input text <文字列>

エミュレーター・実機でテキスト入力欄を選択して、上記のコマンドを実行すると文字入力ができます。
<文字列>の部分に日本語は使えません。
端末のIME設定が入力に反映されますのでローマ字入力してあげれば日本語の入力も可能です。

adb shell
input text <文字列>
でも使えますが、adbを切断したときにコマンド履歴は消えてしまうので
adb shell input text <文字列>
とやったほうが、コマンド履歴から再利用できて良いと思います。

Facebookのテストアカウントとか使ってるとメールアドレス長くて手入力は辛いですよね。。

MacでInkscapeを使う(画像取り込み編)

Inkscapeに画像ファイルを取り込もうとしてハマったのでメモしておく。

ドラッグ&ドロップ

Windows環境ですと、画像ファイルの取り込みはExplorerからドラッグ&ドロップすればOKですが、Mac環境では、ドラッグ&ドロップは受け付けてくれませんでした。
X上で動いているからでしょうか?

コピー&ペースト

なので、今度はコピー&ペーストを試してみましたがこんな感じに...


インポート

で最後に辿り着いたのがインポートです。
メニューの[ファイル] - [インポート]から開きます。
拡張子のフィルタを[すべてのイメージ]にして、取り込みたい画像ファイルを選択すればOKです。
後は、画像を「リンク」にするか「埋め込み」にするか聞かれますのでお好みで。
・リンクにすると、画像ファイルを移動したときにリンク切れになります。
・埋め込みにすると、SVGファイルに埋め込まれるのでファイルサイズが大きくなります。


これで画像が取り込めるようになりました。
Windows環境と比べると少し面倒ですね。

2012年8月4日土曜日

Fragmentationと共に生きる方法

ADT20から1クリックで複数の実機・エミュレーターにアプリをDeploy出来るようになっています。

ADT 20 Preview 3 メモ
http://neta-abc.blogspot.jp/2012/06/adt-20-preview-3.html

この機能を利用すれば、デバッグが少し楽になるんじゃないかと思い試してみました。

機材

・MacBook Air (13-inch, Mid 2012)
・USBハブ(U2H-TZS420Sシリーズ)
 http://www2.elecom.co.jp/cable/usb-hub/u2h-tzs420s/index.asp
・Nexus S(4.1)
・IS11LG(2.3)
・IS06(2.2)


今回使用したUSBハブはセルフパワー対応の物を選んでいます。
アダプタの出力が2.0Aなので、4ポートフルに使った場合でも1ポート当たり500mAは供給される計算です。
複数の端末を使って開発しているとバッテリーマネジメントがストレスだったりします。
今回はその辺りの解消も目指します。
※そもそも、バスパワーだと電力不足で4台も繋げない気もします。確認してませんが...

あとは、ポート単位でON/OFFスイッチが付いている所が、このUSBハブを選んだ理由です。
特定の端末を一時的に切り離したい時に、面倒なUSBの抜き差しが不要なので便利かと思います。

動作確認結果

DDMSで見ると、USBハブ経由で3台の端末が認識されています。

プロジェクトの設定は[Run As] - [Run Configurations...]から行います。

この状態でプロジェクトを実行して見ましたが、問題無く3台の端末にアプリをDeployできました。

まとめ

先日からこの構成でデバッグを行っていますが、Androidのバージョン違いで動作が異なる部分に気付いたりして、楽しく(?)開発を進めています。
タイトルのFragmentationとは離れますが、端末間で通信するアプリのデバッグなんかにも良いんじゃないかと思います。