Edited at

New Features in Picasso

More than 3 years have passed since last update.

Squareが開発している画像ライブラリのPicassoは今や有名ですが,次期リリースに乗る予定の新機能について,Lucas Rochaがブログを書いていたので要約しました。

これらの機能は全てmasterにマージされているので2.4でのリリースが濃厚です。


Request Handlers

Picassoは、単純なリソースからコンテントプロバイダ、ネットワークなど,多くの画像の読み込みをサポートしています。しかし、時にはデフォルトでサポートされていない方法で画像を読み込みたい時もあります。

そういった用途の為にRequest Handlersという機能が追加されました。RequestHanlderを継承して2つのメソッドをオーバーライドします。

public class PonyRequestHandler extends RequestHandler {

private static final String PONY_SCHEME = "pony";

@Override public boolean canHandleRequest(Request data) {
return PONY_SCHEME.equals(data.uri.getScheme());
}

@Override public Result load(Request data) {
return new Result(somePonyBitmap, MEMORY);
}
}

実装したクラスをPicassoの初期化時に渡します。

Picasso picasso = new Picasso.Builder(context)

.addRequestHandler(new PonyHandler())
.build();

すると,以下の様なカスタムスキーマの画像を読み込む事が可能になります。

picasso.load("pony://somePonyName")

.into(someImageView)

必要であればビルトインのRequestHandlerを書き換える事も可能になるようです。


Request Management

Picassoはビューリサイクリングを扱っていますが,非効率な方法です。

例えば,ListViewを勢い良く操作した場合,ユーザーのインタラクションに合わせてリクエストを停止/再開する方法がないので,Picassoはリクエストの発火とキャンセルをそのままにします。

新しいRequest Management APIはタグを用いてリクエストを管理する事を可能にします。特定のタグに関連付けられたリクエストの停止/再開をする事ができるようになります。

Picasso.with(context)

.load("http://example.com/image.jpg")
.tag(someTag)
.into(someImageView)

これによってタグに関連付いた(ListViewのscroll状態など)リクエストの停止/再開が可能になります。例えば,Picassoのサンプルアプリは以下の様なスクロールリスナーを持つようになりました。

public class SampleScrollListener implements AbsListView.OnScrollListener {

...
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
Picasso picasso = Picasso.with(context);
if (scrollState == SCROLL_STATE_IDLE ||
scrollState == SCROLL_STATE_TOUCH_SCROLL) {
picasso.resumeTag(someTag);
} else {
picasso.pauseTag(someTag);
}
}
...
}

Request Management APIは画像のリクエストに関して素晴らしい制御を提供します。スクロールリスナーは極々標準的な使い方の1つに過ぎません。


Request Priorities

UIで画像毎に優先度を付けたいというのはよくあるケースだと思います。例えば,同じ画面内の他のセカンダリ·イメージに関連した,大きなヒーローの画像に高い優先順位を与えたいとか!

これまでは画像間の相対的な優先度についてPicassoに通知する方法はありませんでした。が,priority APIは、リクエストの優先度についてPicassoへの通知を可能にします。

Picasso.with(context)

.load("http://example.com/image.jpg")
.priority(HIGH)
.into(someImageView);

priorityは特定の順序を保証するものではありません,優先度の高いリクエストの方にバランスを傾けるだけです。

これらの新機能を利用したい場合は,GitHubから最新のコードを取得してください。