我们正在为应用中的照片创建共享模式,其中一个共享选项是在线加载图像的叠加层。如果用户在叠加完成加载之前共享照片,我们将使用未修改的图像发送意图以使用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线程?
答案 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() {
}
});