android - 为什么 Picasso 在后台线程中运行会阻塞 onActivityResult?

标签 android multithreading picasso

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

我们遇到的问题是,当用户从共享照片返回时,onActivityResult 不会被调用,直到加载叠加层的后台线程完成。是否有后台线程突然开始阻塞 UI 线程的原因?

这是我们在覆盖 View 类中使用的代码,它扩展了 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 之前的 futures 导致相同的 UI 线程阻塞问题)。这感觉就像一个巨大的 hack,因为我们在应用程序的其他任何地方都使用了 Picasso。

这些后台任务在返回 Activity 时是否会阻塞 UI 线程?

最佳答案

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

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

这是我的 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() {

        }
    });

关于android - 为什么 Picasso 在后台线程中运行会阻塞 onActivityResult?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28995855/

相关文章:

java - 本地广播接收器异常 : android. app.IntentReceiverLeaked?

java - 进程 'command usr/lib/jvm/java-8-oracle/bin/java' 以非零退出值 2 完成

c# - 使用对象而不是 this 获取锁 - 线程

android - 触摸图像时,全屏 ImageView 和缩放应该可以工作

java - 如何在android/java中使用recyclerview和picasso显示图像?

android - 如何在 Android 中下载文件并显示进度?

c# - Richtextbox.invoke,C#,窗体仍挂

multithreading - 如何访问 Robolectric 中的后台线程?

android - 将图像裁剪成圆形

android - Room LiveData 观察器 (onChange) 触发多次但仅针对 INSERT