我想写一个Espresso匹配器,验证“
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); }
现在这个问题当然是我有一个僵局.我在主线程上(匹配器在主线程IIRC上执行),而Glide希望后台线程加载位图,然后返回主线程(在’onResourceReady’)本身.所以我需要从外部等待内部发布的结果,同时保持主线程运行.
我(不成功)尝试通过Looper.loop()在// ???中推进当前的活套并且还尝试了常规的锁/等待方法,但没有任何工作.我没有想法…
解决方法
对于像这样的情况,我使用简单的睡眠,这不是最好的选择,但它适用于我.
public static void waitForActivity(long time) { try { Thread.sleep(time); } catch (InterruptedException e) { e.printStackTrace(); } }