Android 安卓毕加索:不在片段中加载

Android 安卓毕加索:不在片段中加载,android,android-fragments,picasso,Android,Android Fragments,Picasso,我想让毕加索尝试一些更简单的图像内存管理。我只是试图在我的片段中实现它,但是我似乎无法让它工作 mainLayout.setBackground(new BitmapDrawable(getResources(), Picasso.with(mainLayout.getContext()).load(R.drawable.background2).get())); 其中主布局为线性布局。我也试过: Picasso.with(getActivity().getApplicationContext

我想让毕加索尝试一些更简单的图像内存管理。我只是试图在我的片段中实现它,但是我似乎无法让它工作

mainLayout.setBackground(new BitmapDrawable(getResources(), Picasso.with(mainLayout.getContext()).load(R.drawable.background2).get()));
其中主布局为线性布局。我也试过:

Picasso.with(getActivity().getApplicationContext()).load(R.drawable.background2).into(imageView1);
我试过毕加索。用这个。。。但这根本不起作用

我一直得到一个例外:

java.lang.IllegalStateException: Method call should not happen from the main thread.
at com.squareup.picasso.Utils.checkNotMain(Utils.java:71)
at com.squareup.picasso.RequestCreator.get(RequestCreator.java:206)
at ... 
我叫它的地方


有没有人经历过这种情况,或者知道如何正确使用碎片?

异常消息非常清楚地说明了这一点。 .get()消息不是异步的,因此将在主线程上执行工作(网络、读取文件等等),您应该尽可能避免这样做

不过,您将图像设置为imageView的代码对我来说似乎是正确的

我认为主布局也可以这样做(毕加索会自动将可绘制/位图设置为背景)。 如果我错了,请看一下毕加索附带的Target.class。您可以将映像加载到目标中,目标必须提供成功和错误的处理程序。在成功处理程序中,一旦加载位图,您将获得该位图,并可以将其设置为默认值

有几个解决方案,可能适用于您的情况

[编辑]

使用毕加索提供的get()方法时,加载将在您当前使用的线程中进行,这在源代码中有明确说明:

/**同步完成此请求。不能从主线程调用*/

公共位图get()引发IOException{[…]}

在您的情况下,我将使用目标接口,它在加载映像时提供回调

Picasso.with(getActivity()).load(R.drawable.background2).into(new Target(){

  @Override
  public void onBitmapLoaded(Bitmap bitmap, LoadedFrom from) {
     mainLayout.setBackground(new BitmapDrawable(context.getResources(), bitmap));
  }
  
  @Override
  public void onBitmapFailed(final Drawable errorDrawable) {
      Log.d("TAG", "FAILED");
  }

  @Override
  public void onPrepareLoad(final Drawable placeHolderDrawable) {
      Log.d("TAG", "Prepare Load");
  }      
});
既然您在这里使用内部资源,为什么不执行以下操作

mainLayout.setBackgroundResource(R.drawable.background2);
希望这有帮助


关于

异常消息非常清楚地说明了这一点。 .get()消息不是异步的,因此将在主线程上执行工作(网络、读取文件等等),您应该尽可能避免这样做

不过,您将图像设置为imageView的代码对我来说似乎是正确的

我认为主布局也可以这样做(毕加索会自动将可绘制/位图设置为背景)。 如果我错了,请看一下毕加索附带的Target.class。您可以将映像加载到目标中,目标必须提供成功和错误的处理程序。在成功处理程序中,一旦加载位图,您将获得该位图,并可以将其设置为默认值

有几个解决方案,可能适用于您的情况

[编辑]

使用毕加索提供的get()方法时,加载将在您当前使用的线程中进行,这在源代码中有明确说明:

/**同步完成此请求。不能从主线程调用*/

公共位图get()引发IOException{[…]}

在您的情况下,我将使用目标接口,它在加载映像时提供回调

Picasso.with(getActivity()).load(R.drawable.background2).into(new Target(){

  @Override
  public void onBitmapLoaded(Bitmap bitmap, LoadedFrom from) {
     mainLayout.setBackground(new BitmapDrawable(context.getResources(), bitmap));
  }
  
  @Override
  public void onBitmapFailed(final Drawable errorDrawable) {
      Log.d("TAG", "FAILED");
  }

  @Override
  public void onPrepareLoad(final Drawable placeHolderDrawable) {
      Log.d("TAG", "Prepare Load");
  }      
});
既然您在这里使用内部资源,为什么不执行以下操作

mainLayout.setBackgroundResource(R.drawable.background2);
希望这有帮助

关于

试试看 试试看
你是说我应该在异步任务中加载它们?不,我不建议这样做,它只是在不需要的地方增加了复杂性。我将编辑我的答案并提供一些工作示例。好的,这很好,更有意义。关于mainLayout.setBackgroundResource(),这在内存消耗方面是一个好方法吗?毕加索已经在后台线程中满足了您的要求
get()
如果您想同步加载位图并执行除显示(可能是上载)以外的操作,是否存在此问题。因此,您是说我应该在异步任务中加载位图?不,我不建议这样做,这只会在不需要的地方增加复杂性。我将编辑我的答案并提供一些工作示例。好的,这很好,更有意义。关于mainLayout.setBackgroundResource(),这在内存消耗方面是一个好方法吗?毕加索已经在后台线程中满足了您的要求
get()
如果您希望同步加载位图并执行除显示位图以外的操作(可能是上载位图),则存在此选项。