android – 加载图像与Glide同步

我想写一个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();
     }
 }

相关文章

Android 如何解决dialog弹出时无法捕捉Activity的back事件 在...
Android实现自定义带文字和图片的Button 在Android开发中经常...
Android 关于长按back键退出应用程序的实现最近在做一个Andr...
android自带的时间选择器只能精确到分,但是对于某些应用要求...