在那里,我有一个循环:

    public void updateDrawee(View view) {
            if (begin) {
                begin = false;
                for (int i = 0; i < 5; i++) {
                    CloseableReference<CloseableImage> reference = createBitmapRefer(i);
                    Log.i("reference", reference+"");
                    imgList.add(reference);
                }Log.i("imgList", imgList.toString());Log.i("imgList.0", imgList.get(0)+"");
            }
    //...some code
}


和方法createBitmapRefer(int count)遵循:

    public CloseableReference<CloseableImage> createBitmapRefer(int count) {
        ImagePipeline pipeline = Fresco.getImagePipeline();
        int[] drawableIds = {R.drawable.alpha1, R.drawable.alpha2,
                R.drawable.alpha3, R.drawable.alpha4, R.drawable.alpha5};

        ImageRequest levelRequest
                = ImageRequestBuilder.newBuilderWithResourceId(drawableIds[count])//++
                .setProgressiveRenderingEnabled(true)//逐行加载
                .build();

        CloseableReference<CloseableImage> bmpReference = null;

        DataSource<CloseableReference<CloseableImage>> dataSource
                = pipeline.fetchImageFromBitmapCache(levelRequest, this);
        try {
            if (!dataSource.hasResult()) {
                dataSource = pipeline.fetchDecodedImage(levelRequest, this);
            }
            //count %= 5;

            Log.i("dataSource has result", dataSource.hasResult() +"");
            Log.i("dataSource fail?", dataSource.hasFailed() + "");
            bmpReference = dataSource.getResult();
            Log.i("bmpRefer", bmpReference+"");
            if (bmpReference != null) {
                CloseableReference<CloseableImage> returnRef;
                returnRef = bmpReference.clone();
                return returnRef;
            }else {
                return null;
            }
        }finally {
            dataSource.close();
            CloseableReference.closeSafely(bmpReference);
        }

    }


当我调试时,如果我单击进入并逐步查看代码,它将返回我想要的CloseableReference,并且imgList(它为ArrayList)也可以获取元素。但是如果我跳过for循环,它什么也没返回!
继续看看有什么区别吗???

手表在imgList中显示元素,当index = 1和4时,我单击step进入。

java - 关于android调试器的怪异现象(CloseableReference)-LMLPHP

和logcat显示Log.i()打印的内容。

java - 关于android调试器的怪异现象(CloseableReference)-LMLPHP
还是因为我没有以标准化方式使用此类CloseableReference

最佳答案

让我尝试解释这里发生的情况。


您未按预期方式使用Fresco。我将退一步,强烈建议您只需要显示图像就使用SimpleDraweView。但是,如果您确实需要基础位图,则可以通过ImagePipeline获取它,方法与您已经做过的类似,但有一个关键的区别。图像获取异步进行。这意味着您不能只执行dataSource = pipeline.fetchDecodedImage(...)然后立即执行dataSource.getResult。如果在内存缓存中找不到该映像,则getResult将仅返回null。相反,您需要按照Fresco documentation中的说明将subscribe更改为DataSource。如果您打算直接使用chapters about ImagePipeline,我强烈建议您阅读。否则,由于渲染回收的位图,可能导致应用程序泄漏内存或崩溃。
您在调试器中看到的正是我上面所描述的。大小为5的数组如下所示:

0 =空,
1 = CloseableReference @ 4908,
2 =空,
3 =空,
4 = CloseableReference @ 5231


为了简洁起见,AndroidStudio UI只隐藏了空条目。如果您不喜欢它,可以通过右键单击并打开选项将其关闭。之所以会得到1和4,是因为在位图内存缓存中找到了该图像,并立即从该图像中检索了该图像。您将0、2和3设为null的原因是尚未加载图像。壁画可能需要下载该映像,即使它已经下载并位于磁盘缓存中,也可能需要对映像进行解码。所有这一切都需要一些时间,并且不是瞬时的。这就是为什么您需要订阅回调,并且ImagePipeline会在图像准备就绪时通知您。

07-24 19:00