为什么Picasso在后台线程中运行阻止onActivityResult?

时间:2015-03-11 19:39:27

标签: android multithreading picasso

我们正在为应用中的照片创建共享模式,其中一个共享选项是在线加载图像的叠加层。如果用户在叠加完成加载之前共享照片,我们将使用未修改的图像发送意图以使用startActivityForResult与其他应用共享,然后在onActivityResult中,我们将用户从共享视图返回到普通照片视图。

我们遇到的问题是,当用户从共享照片返回时,onActivityResult不会被调用,直到加载叠加层的后台线程结束。有没有理由后台线程突然开始阻止UI线程?

以下是我们在overlay视图类中使用的代码,它扩展了ImageView以管理它:

private void asyncLoadImage() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            loadImage();
        }
    }).start();
}

private void loadImage() {
    try {
        overlayBitmap = Picasso.with(getContext()).load(url).get();
        if (overlayBitmap != null) {
            displayBitmap();
        } else {
            displayError();
        }

    } catch (IOException ignored) {
        displayError();
    }
}

我们已经尝试过使用Picasso目标而不是创建我们自己的线程,我们遇到了完全相同的问题,到目前为止唯一的解决方案是异步使用Ion(但是,同步使用Ion或尝试取消Ion请求)在我们调用startActivityForResult之前的期货导致相同的UI线程阻塞问题)。这是一个巨大的黑客,因为我们在应用程序中的其他地方使用毕加索。

这些后台任务在返回活动时是否会阻止UI线程?

1 个答案:

答案 0 :(得分:6)

查看代码,您将在不需要时创建新线程。 Picasso有一个可配置的线程执行器方法。

使用毕加索加载100多张图片时出现问题,它会锁定并阻止我的UI线程,但这是因为每当我调用毕加索来获取图像时它都会创建一个新线程。我通过做一些研究解决了这个问题,并发现在毕加索中有一个可配置的执行器方法。

这是我的ImageHandler类实现

public class ImageHandler {

private static Picasso instance;

public static Picasso getSharedInstance(Context context)
{
    if(instance == null)
    {
        instance = new Picasso.Builder(context).executor(Executors.newSingleThreadExecutor()).memoryCache(Cache.NONE).indicatorsEnabled(true).build();
        return instance;
    }
    else
    {
        return instance;
    }
}
}

我不知道这是你的问题,但是如果你还没有实现它,那将值得一试 这是我用它来加载图像的方式

    ImageHandler.getSharedInstance(getApplicationContext()).load(imString).skipMemoryCache().resize(width, height).into(image, new Callback() {
        @Override
        public void onSuccess() {
            layout.setVisibility(View.VISIBLE);
        }

        @Override
        public void onError() {

        }
    });
相关问题