blog

Picassoソースコード commit 注:メインスレッドかどうかを判断するには?

画像の取得がImageViewに表示されることを意図していない場合があることを考慮し、ここでは特別にお願いします。Bitmapのget()メソッドでは、ImageViewが設定されていないリクエストオ...

Jul 2, 2020 · 2 min. read
シェア

以下のコードノートは : 12652d2fd80c54df43c90e57ccd16998779c3d95, commit time: 2013/2/20 10:26に基づいています。

この連載は5つのパートで構成されています。リファクタリングは、同じ機能のためのコードの変更です。フィーチャーは、今回のコミットと比較した新しい機能です。設計は、私が言及できると思うコードの設計です。この部分はプログラマによって異なるかもしれません。Doubtは、コードを見たときに問題がある、あるいは理解できないと思うことです。知識はJavaやAndroidに関する一般的な知識です。

特徴

ImageView以外の場合の特別なリクエストを提供します。

イメージの取得が ImageView に表示されることを意図していない場合があることを考慮し、ここでは特別なリクエストを行っています。Request.javaのBitmap get()メソッドでは、ImageViewが設定されていないリクエストオブジェクトを生成し、picassoのrunメソッドを直接呼び出しています。このコミットにより、runメソッドはビットマップオブジェクトを返すように変更されました。タスクはスレッドプールに投入されないので、このメソッドは同期的で時間がかかり、ネットワーク経由のダウンロードに時間がかかるとブロックされることに注意してください。メイン・スレッドはネットワーク・リクエストを開始できないので、このメソッドをメイン・スレッドから呼び出すことはできません。

ひねり出す

メインスレッドにいるかどうかを判断し、そうでない場合はエラーを報告します。

前述のRequest.javaのBitmap get()メソッドはメインスレッドでは呼び出せないので、このメソッドの最初の文でメインスレッドかどうかを判断し、メインスレッドでなければエラーを報告します。その判定方法が、Picasso.javaのcheckNotMainメソッドです。

小型トライキャッチ

loadFromCaches(Request request) これは、Picasso.javaのメソッドで見ることができます。このメソッドは、もともとは1つの大きなトライ・キャッチでしたが、粒度を小さくした複数のトライ・キャッチに変更され、各キャッチの後に対応するエラー・メッセージが表示されるようになったため、デバッグが容易になりました。

ちしんてん

ストリングスプライス

文字列のスプライスは、String.format("xxxx %d", 1)を使って固定フォーマットの文字列を生成することができます。

メインスレッドにいるかどうかの見分け方

メインスレッドにはルーパーがあり、このルーパーはメインスレッドのオブジェクトを取得できるので、現在のスレッドがメインスレッドであるかどうかを比較することができます。具体的なコードは以下の通りです:Looper.getMainLooper().getThread() == Thread.currentThread()

Read next

最初のデザインパターン:ファクトリー・メソッド・パターン

ファクトリーメソッドパターンはオブジェクトを作成するインターフェースを定義しますが、どのクラスをインスタンス化するかはサブクラスに任せます。ファクトリーメソッドによって、クラスはインスタンス化をサブクラスに委ねることができます。 追記: デザインパターンにおいて「インターフェースを実装する」とは、一般的にスーパータイプのメソッドを実装することを意味します。 具体的なオブジェクトはサブクラス化によって作成されます。クライアントが知る必要があるのは、抽象型だけです。 何をインスタンス化するかはサブクラス次第です。

Jul 2, 2020 · 6 min read