我正在尝试使用Picasso进行更简单的图像内存管理。我一直试图在我的片段中实现它,但我似乎无法让它工作。
mainLayout.setBackground(new BitmapDrawable(getResources(), Picasso.with(mainLayout.getContext()).load(R.drawable.background2).get()));
其中mainLayout是LinearLayout。我也试过这个:
Picasso.with(getActivity().getApplicationContext()).load(R.drawable.background2).into(imageView1);
我尝试过Picasso.with(this)......但这根本不起作用。
我一直得到例外:
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 ...
我打电话给他。
任何人都会遇到这种情况或知道如何正确使用这些片段吗?
答案 0 :(得分:9)
异常消息表明它很清楚。 .get()消息不是异步的,因此将在主线程上完成工作(网络,读取文件,等等),尽可能避免这种情况。
但是,将图像设置为imageView的代码对我来说似乎是正确的。
我认为也可以对mainLayout做同样的事情(Picasso会自动将drawable / Bitmap设置为背景)。 如果我在这里错了,请看看Picasso附带的Target.class。您可以将图像加载到目标中,该目标必须为成功和错误提供处理程序。在成功处理程序中,您将在加载后获取位图,并将其设置为您的bakground。
有一些解决方案,可能适用于您的情况。
[编辑]
当使用Picasso提供的get()方法时,加载将在您当前正在使用的线程中进行,这在源代码中有明确说明: https://github.com/square/picasso/blob/master/picasso/src/main/java/com/squareup/picasso/RequestCreator.java
/ **同步满足此请求。不得从主线程调用。 * /
public Bitmap get()抛出IOException {[...]}
在你的情况下,我会使用Target接口,它在加载图像时提供回调。
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);
希望这有帮助。
此致
答案 1 :(得分:0)
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
holder = new ViewHolder();
v = vi.inflate(Resource, null);
holder.imageview = (ImageView) v.findViewById(R.id.news_img);
holder.tvName = (TextView) v.findViewById(R.id.news_title);
holder.tvDate = (TextView) v.findViewById(R.id.news_time);
v.setTag(holder);
} else {
holder = (ViewHolder) v.getTag();
}
holder = (ViewHolder )v.getTag();
Picasso.with(context).load(postList.get(position).getThumbnail()).into(holder.imageview);
holder.tvName.setText(postList.get(position).getTitle());
holder.tvDate.setText(postList.get(position).getDate());
return v;
}