「ImageView」に特定のビットマップが設定されていることを確認するエスプレッソマッチャーを作成します。アプリはグライド経由で画像を読み込んでいるので、実際に予想されるビットマップと実際のビットマップを比較する前に、クロップ/センタリングを考慮してテスト側で同じことをしなければならないと思った。ここでイメージをGlideと同時にロードする
は、私がこれまでに思い付いたものです:
BitmapRequestBuilder<Uri, Bitmap> bitmapRequest = Glide.with(imageView.getContext())
.load(Uri.parse("file:///android_asset/" + mPath))
.asBitmap();
switch (imageView.getScaleType()) {
case CENTER_CROP:
bitmapRequest.centerCrop();
break;
case FIT_CENTER:
case FIT_START:
case FIT_END:
bitmapRequest.fitCenter();
break;
default:
// no scaling applied to the ImageView under test
}
AtomicReference<Bitmap> bmRef = new AtomicReference<>();
bitmapRequest.into(new SimpleTarget<Bitmap>(
imageView.getMeasuredWidth(),
imageView.getMeasuredHeight()
) {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
bmRef.set(resource);
}
});
// ???
try {
Bitmap expected = bmRef.get();
return expected.sameAs(bitmap);
} catch (Exception e) {
throw new IllegalStateException("could not load asset " + mPath, e);
}
は、今ここでの問題は、私がデッドロックを持っていることはもちろんです。私はメインスレッド(matcherはメインスレッドIIRCで実行されます)にあり、Glideはバックエンドスレッドにビットマップをロードさせ、メインスレッド( 'onResourceReady'内)に戻ります。だから私はメインスレッドを実行したままで、内部に掲載されている結果を外部から待つ必要があります。
Looper.loop()
で現在のルーパーを// ???
に進めようとしましたが、通常のロック/ウェイトアプローチを試みましたが、何も機能しませんでした。私はアイデアがありません...
これは、このケースでは動作しません、残念ながら、もう一度それを試してみました。 –