与 Glide 同步加载图像
Posted
技术标签:
【中文标题】与 Glide 同步加载图像【英文标题】:Loading image synchronously with Glide 【发布时间】:2016-06-08 02:46:49 【问题描述】:我想编写一个 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()
中的// ???
推进当前的looper,并尝试了常规的锁定/等待方法,但没有任何效果。我没有想法......
【问题讨论】:
【参考方案1】:对于这种情况,我使用简单的sleep
,这不是最好的选择,但它对我有用。
public static void waitForActivity(long time)
try
Thread.sleep(time);
catch (InterruptedException e)
e.printStackTrace();
【讨论】:
这种情况下不起作用,很遗憾,刚刚又试了一次。【参考方案2】:一种将比较逻辑保存在 onResourceReady 中的方法, 然后,如果您使用任何事件总线,则使用结果触发事件并将 UI 逻辑放入订阅此事件的方法中。如果不使用任何事件总线,则LocalBroadcastManager 广播结果。
例如:
private BroadcastReceiver receiver;
private void doWhateverYouWantWithResult(boolean result)
bitmapRequest.into(new SimpleTarget<Bitmap>(
imageView.getMeasuredWidth(),
imageView.getMeasuredHeight()
)
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation)
bmRef.set(resource);
Bitmap expected = resource;
boolean result = expected.sameAs(bitmap);
Intent localIntent =
new Intent(BROADCAST_ACTION)
// Puts the status into the Intent
.putExtra(MATCH_RESULT, result);
// Broadcasts the Intent to receivers in this app.
LocalBroadcastManager.getInstance(this).sendBroadcast(localIntent);
);
@Override
public void onResume()
super.onResume();
receiver = new BroadcastReceiver()
@Override
public void onReceive(Context context, Intent intent)
boolean result = intent.getBooleanExtra(MATCH_RESULT);
doWhateverYouWantWithResult(result);
;
LocalBroadcastManager.getInstance(getContext())
.registerReceiver(receiver, new IntentFilter(BROADCAST_ACTION));
@Override
public void onPause()
super.onPause();
LocalBroadcastManager.getInstance(getContext()).unregisterReceiver(receiver);
【讨论】:
以上是关于与 Glide 同步加载图像的主要内容,如果未能解决你的问题,请参考以下文章
在最新的 Firebase 版本 (10.2.4) 中使用 Glide 和 FirebaseUI 加载图像