与 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 加载图像

如何在我的应用中使用 Glide 加载图像?

如何使用 Firebase 中的 Glide 仅加载部分图像?

为啥 Glide 只第二次加载图像? (安卓)

Android Glide:在加载实际图像之前显示模糊图像

有没有办法将图像作为位图加载到 Glide